我不明白这里发生了什么。我有以下内容:
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';
有什么想法吗?为什么在这种情况下不使用include路径?
来自包含文档
基于给定的文件路径包括文件,指定的include_path。如果在include_path,include将最终签入调用脚本自己的目录和失败前的当前工作目录。
如果您使用Zend/Loader/StandardAutoloader.php
,则假定给定了文件路径,因此它使用了该路径,当然该路径并没有指向正确的目录。如果您使用StandardAutoloader.php
,那么它使用include_path来查找此项。
来自包含手册:
如果include构造找不到文件,它将发出警告;这与require的行为不同,会发出致命错误
然后我注意到脚本在require
期间没有发出致命错误,而是在导致错误的下一行:
$loader = new Zend'Loader'StandardAutoloader($config);
因此,require
行包含something,只是该something不包含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框架1.12.9,但我的应用程序使用的是2.2版本。