Включить игнорируемый путь

Я не понимаю, что здесь происходит. У меня есть следующее:

set_include_path(
    get_include_path()
    .PATH_SEPARATOR.'/home/mike/www/Zend/library/'
);

Который, кажется, устанавливает значение правильно:

var_dump(get_include_path());
// string(61) ".:/usr/share/php:/usr/share/pear:/home/mike/www/Zend/library/"

Это должно работать, однако это производит Fatal error: Class 'Zend\Loader\StandardAutoloader' not found:

require_once 'Zend/Loader/StandardAutoloader.php';

Но если я использую полный путь, он работает нормально:

require_once '/home/mike/www/Zend/library/Zend/Loader/StandardAutoloader.php';

Любые идеи, почему он не использует путь включения в этом случае?

2 ответа

Решение

Из включенного руководства:

Конструкция include выдаст предупреждение, если не сможет найти файл; это поведение отличается от require, что приведет к фатальной ошибке.

Затем я заметил, что сценарий не генерирует фатальную ошибку во время require но вместо этого это было на следующей строке, которая вызывала ошибку:

$loader = new Zend\Loader\StandardAutoloader($config);

Следовательно require линия включала что-то, только то, что что-то не содержалоZend\Loader\StandardAutoloaderучебный класс.

Затем я взялся за этот маленький скрипт, чтобы увидеть, откуда он взялся:

$include_paths = explode(PATH_SEPARATOR, get_include_path());
foreach ($include_paths as $path) {
    $file = 'Zend/Loader/StandardAutoloader.php';
    echo $path .'/'. $file;
    echo '...';
    echo (file_exists($path . '/'. $file)) ? '<b>exists</b>' : 'doesnt exist';
    echo '<br>';
}

Это результат:

./Zend/Loader/StandardAutoloader.php...doesnt exist
/usr/share/php/Zend/Loader/StandardAutoloader.php...exists
/usr/share/pear/Zend/Loader/StandardAutoloader.php...doesnt exist
/home/mike/www/Zend/library/Zend/Loader/StandardAutoloader.php...exists

Получается, у меня было два файла, которые совпадали с тем, что я пытался включить. Когда я открою /usr/share/php/Zend/Loader/StandardAutoloader.php Я вижу, что вместо этого использует класс Zend_Loader_StandardAutoloader без пространства имен. Это из Zend Framework 1.12.9, но мое приложение использует версию 2.2.

Из включенной документации

Файлы включаются на основе заданного пути к файлу или, если он не указан, указан include_path. Если файл не найден в include_path, include наконец проверит собственный каталог вызывающего скрипта и текущий рабочий каталог, прежде чем произойдет сбой.

Если вы используете Zend/Loader/StandardAutoloader.php тогда предполагается, что указан путь к файлу, поэтому он использовал этот путь, который, конечно, не указывает на правильный каталог. Если вы используете StandardAutoloader.phpЗатем он использовал include_path, чтобы найти это.

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