Я использую 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
Может кто-нибудь объяснить, почему я получаю ошибку со второй структурой каталогов.
Если кому-то нужен весь код для тестирования, найдите ссылку ниже
Ваша проблема в том, что вы используете относительный путь, который не всегда устанавливается в качестве каталога текущего скрипта. Вам нужно использовать абсолютные пути, чтобы убедиться, что вы загружаете то, что вам нужно.
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 во втором примере.