404 при попытке использовать пространства имен в классе PHP [duplicate]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

5
задан Ketan Mujumdar 3 December 2014 в 10:35
поделиться

3 ответа

Автозагрузчик Fat-Free Framework очень прост. Он ожидает, что вы определите одну или несколько автозагружаемых папок, каждая из которых будет отображаться в корневое пространство имен.

Итак, скажем, вы определяете $f3->set('AUTOLOAD','app/;inc/'), а ваша файловая структура:

- app
- inc
- lib
  |- base.php
- index.php

Затем класс с именем MyClass, принадлежащий пространству имен Foo\Bar (полный путь: Foo\Bar\MyClass), должен быть сохранен либо в app/foo/bar/myclass.php, либо inc/foo/bar/myclass.php (помните: мы указали две папки для автоматической загрузки).

Примечание: не забудьте указать namespace Foo\Bar в начале myclass.php (автозагрузчик не сделает этого для вас).

-

So чтобы ответить на вашу конкретную проблему, имеющую следующую структуру файла:

- lib
  |- base.php
- src
  |- controllers
     |- index.php
- index.php

возможны три конфигурации:

Конфигурация 1

$f3->set('AUTOLOAD','src/controllers/')

Затем все файлы под src/controllers/ будут автоматически загружены, но помните: src/controllers/ сопоставляется с корневым пространством имен, поэтому означает, что класс Index должен принадлежать корневому пространству имен (полный путь: \Index).

Config 2

$f3->set('AUTOLOAD','src/')

Затем будут загружены все файлы под src/, что означает, что класс Index должен принадлежать Controllers namespace (полный путь: \Controllers\Index).

Config 3

$f3->set('AUTOLOAD','./')

Тогда все файлы под ./ будут автоматически загружены, что означает класс Index должен принадлежать пространству имен Src\Controllers (полный путь: \Src\Controllers\Index).

8
ответ дан xfra35 18 August 2018 в 09:51
поделиться

Попробуйте эту конфигурацию - ваш класс:

namespace Creo\Controllers;

Рамочные маршруты

GET|POST / = \Creo\Controllers\IndexController->indexAction

местоположение папки

_your_app_dir/app/Creo/Controllers

Ваш файл начальной загрузки (в этом case в _your_app_dir / app /)

spl_autoload_register(function ($className) {
    $filename = __DIR__ . '/' . str_replace('\\', '/', $className) . ".php";
    if (file_exists($filename)) {
        include($filename);
            if (class_exists($className)) {
            return true;
        }
    }
    return false;
});

Надеюсь, это поможет.

0
ответ дан mirekratman 18 August 2018 в 09:51
поделиться
  • 1
    эта структура уже имеет зарегистрированный автозагрузчик, который должен использоваться для этой задачи. не нужно добавлять еще один. – ikkez 4 December 2014 в 13:10
  • 2
    Да, я хочу использовать их автозагрузчик и заставить его работать. – Ketan Mujumdar 5 December 2014 в 06:35

Fat-Free всегда является корневым пространством имен "\". (следующее может быть неправильным). Поскольку F3 загружает ваши классы через автозагрузчик, вам всегда нужно добавить корневое пространство имен в свои собственные пространства имен. В этом случае вы должны изменить его на

namespace \Src\Controllers;

. И, конечно же, вы должны изменить его и в ваших маршрутах.

GET /=\Src\Controllers\Index->index

Чтобы помочь вам найти эти проблемы в будущем вы можете увеличить значение DEBUG с помощью

$f3->set('DEBUG', 2); // 0-3; 0=off, 3=way too much information
1
ответ дан sascha 18 August 2018 в 09:51
поделиться
  • 1
    Я изменил свое пространство имен, как вы уже упоминали, тем не менее. – Ketan Mujumdar 3 December 2014 в 10:32
  • 2
    На самом деле это должно быть наоборот, так как ваша папка AUTOLOAD - src/controllers/. Это означает, что эта папка считается root. Таким образом, ваш индекс находится в глобальном пространстве имен: вы должны удалить директиву namespace и вызвать GET /=Index->index. – xfra35 3 December 2014 в 10:57
  • 3
    @ xfra35 Да, это работает, но мне нужно быть им в пространстве имен, так как мне нужно также запускать тесты. – Ketan Mujumdar 3 December 2014 в 11:11
  • 4
    В этом случае оставьте его в пространстве имен Src\Controllers, но измените значение AUTOLOAD на ./ (AUTOLOAD всегда следует указывать на корневую папку). – xfra35 3 December 2014 в 11:47
  • 5
    @ xfra35 Я пробовал это, не загружая ничего. – Ketan Mujumdar 5 December 2014 в 06:34
Другие вопросы по тегам:

Похожие вопросы: