包含被忽略的路径

时间:2016-03-30 03:18:11

标签: php path include

我不明白这里发生了什么。我有以下内容:

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 个答案:

答案 0 :(得分:0)

来自Include documentation

  

根据给定的文件路径包含文件,如果没有给出,则包含   指定的include_path。如果在。中找不到该文件   include_path,include将最终检入调用脚本自己的   目录和失败前的当前工作目录。

如果您使用Zend/Loader/StandardAutoloader.php,则假定已提供文件路径,因此它使用此路径,当然这不会指向正确的目录。如果您使用StandardAutoloader.php,则会使用include_path来查找此内容。

答案 1 :(得分:0)

来自include manual

  

如果找不到文件,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版。