我的自动加载器功能遇到了一个非常奇怪的问题。
这是我的自动加载器功能,取自PSR-0 标准:
function __autoload($className) {
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
$lastNsPos = strrpos($className, '\\');
if ($lastNsPos) {
$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 dirname(__FILE__) . DIRECTORY_SEPARATOR . $fileName;
}
我对该函数所做的唯一修改是将函数添加dirname(__FILE__)
到require
函数中,因为我将此函数保存在一个名为 的目录includes
中,我的所有其他类都保存在该目录中。这段代码适用于我的另一个项目,所以我不太确定这里出了什么问题。
我有一个文件:includes\SQL\Persistable.php
命名空间声明为namespace SQL;
. 当自动加载器运行时,它给了我这个错误:
Warning: require(/home/user/public_html/phpProject/includes/Persistable.php): failed to open stream: No such file or directory in /home/user/public_html/phpProject/includes/config.php on line 52
我知道那个文件不存在,但我不确定它为什么要加载它。它应该要求/home/user/public_html/phpProject/includes/SQL/Persistable.php
. 但是,当我require
像这样更改功能时(只是为了测试):
require dirname(__FILE__) . DIRECTORY_SEPARATOR . ' ' . $fileName;
我得到:
Warning: require(/home/user/public_html/phpProject/includes/ SQL/Persistable.php): failed to open stream: No such file or directory in /home/user/public_html/phpProject/includes/config.php on line 52
我不确定为什么添加一个空格,或者实际上是除正斜杠之外的任何字符,会导致require
函数包含$fileName
. 我也试过:
echo dirname(__FILE__) . DIRECTORY_SEPARATOR . $fileName;
其输出是:
/home/user/public_html/phpProject/includes/SQL/Persistable.php
但是,它显然不是在require
函数中那样解释的。为什么?
我也尝试过__DIR__
,通过显式设置包含路径set_include_path()
,将函数放在自己的单独文件中并包含该文件,并且realname()
,它们都没有工作。正如我所说,这段代码之前已经工作过,所以我不确定为什么我现在要提出这个问题!