PHP Autoloader добавить путь к пространству имен

Моя структура MVC следующая:

- web
  -- Classes
    --- Loader.php
  -- Core
    --- Controller.php
    --- Model.php
    --- View.php
    --- Bootstrap.php
    --- DB.php
  -- Project
    --- Controllers (folder)
    --- Models (folder)
    --- Views (folder)

Теперь у меня есть пространства имен, указанные для каждого. Например, у меня есть

    namespace Classes; //for Loader.php
    namespace Core; //For Controller.php, Model.php etc...
    namespace Project\Controllers; //For Controllers inside Controllers folder etc...

Мой автозагрузчик выглядит так:

public static function Autoloader2($className) {
    $className = explode('\\', $className);
    $class = array_pop($className);
    $namespace = implode(DIRECTORY_SEPARATOR, $className);
    $file = $namespace . DIRECTORY_SEPARATOR . str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';

   require $file;
}

и мой основной index.php использует

    spl_autoload_register( array('Loader', 'Autoloader2') );
    $app = new Core\Bootstrap();

когда я открываю localhost/web/ я получаю следующую ошибку:

  Warning: require(Core/Project/Controllers/Index.php): failed to open stream: N

Кажется, это добавляет Core / к запрашиваемому файлу. Index.php находится внутри проекта / контроллеров, а не ядра / проекта / контроллеров. Если я попытаюсь удалить

  //namespace Core; from Bootstrap.php i get the following error
  Fatal error: Class 'Core\Bootstrap' not found 

Пожалуйста помоги

1 ответ

Решение

Вы должны использовать $app = \Core\Bootstrap();,

Косая черта перед путем важна, без нее ваши пути в пространстве имен будут относительно друг друга.

Другие вопросы по тегам