Получение ошибки в автозагрузке 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

0

Решение

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

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__ гарантированно возвращает каталог, в котором находится текущий скрипт.

1

Другие решения

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

1

По вопросам рекламы [email protected]