Включить игнорируемый путь
Я не понимаю, что здесь происходит. У меня есть следующее:
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, чтобы найти это.