Получение ошибки в автозагрузке PHP

Я использую PSR-0 для автоматической загрузки, я знаю, что мне нужно использовать PSR-4, что я и сделаю позже. Даже если PSR-4, ответы приветствуются.

У меня следующая структура каталогов, для которой автоматическая загрузка работает нормально.

+ www/entity
|__ /EntityGenerator
|       |__ /Database
|       |       |__ DatabaseConnection
|       |       |__ DatabaseConnectionInterface
|       |       |__ DatabaseRepositoryInterface
|       |       
|       |__ /Exception
|
|__ autoload.php
|__ index.php

Для следующей структуры каталогов это дает ошибку следующим образом

Предупреждение: требуется (EntityGenerator\Database\DatabaseConnection.php): не удалось открыть поток: нет такого файла или каталога в C:\wamp\www\entity\EntityGenerator\autoload.php в строке 15

+ www/entity
| __ /EntityGenerator
        |__ /Database
        |       |__ DatabaseConnection
        |       |__ DatabaseConnectionInterface
        |       |__ DatabaseRepositoryInterface
        |       
        |__ /Exception
        |__ autoload.php
        |__ index.php

Может кто-нибудь объяснить, почему я получаю ошибку со второй структурой каталогов.

Если кому-то нужен весь код для тестирования, найдите ссылку ниже

https://github.com/channaveer/EntityGenerator

2 ответа

Решение

Ваша проблема в том, что вы используете относительный путь, который не всегда устанавливается в качестве каталога текущего скрипта. Вам нужно использовать абсолютные пути, чтобы убедиться, что вы загружаете то, что вам нужно.

function autoload($className)
{
    $namespaceRoot = "EntityGenerator"; 
    $className = ltrim($className, '\\');
    if (strpos($className,$namespaceRoot) !== 0) { return; } //Not handling other namespaces
    $className = substr($className, strlen($namespaceRoot));
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    require __DIR__.DIRECTORY_SEPARATOR.$fileName; //absolute path now
}
spl_autoload_register('autoload');

__DIR__ гарантированно возвращает каталог, в котором находится текущий скрипт.

Это потому, что структура каталогов. Вы пытаетесь загрузить EntityGenerator\Database\DatabaseConnection. это соответствует пути в первом примере, но не для второго. Просто посмотрите на путь из autoload.php. Он ищет пути на своем пути. EntityGenerator является допустимым путем в www/entity, который является путем для autoload.php. Но не для www/entity/EntityGenerator во втором примере.

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