spl_autoload_register有多聪明?在尝试包含之前,它是否知道在其他文件中“预见”类定义?
当我运行我的index.php页面时,我看到了 致命错误:第4行的/var/www/php/classes/input/date.php中找不到类'input \ input'
index.php运行以下命令(在此块之后,它从其中一个类创建一个对象,如果我取消注释一行,一切都能正常工作)
function my_autoloader() {
//include_once "/var/www/php/classes/input/input.php"; //if this is uncommented, it fixes the problem, but I'm not sure why
foreach (glob("/var/www/php/classes/*/*.php") as $filename)
{
require_once $filename;
}
}
spl_autoload_register('my_autoloader');
我的语法错了吗? spl_autoload_register应该以这种方式运行吗?这些文件夹中的许多其他文件依赖于彼此,自动加载器似乎“弄明白”。我不知道为什么它突然挂在“输入”类上,特别是
答案 0 :(得分:1)
你错误地使用它。
自动加载仅用于在回调的第一个参数上自动加载给定的类名,而不是像你正在那样加载所有类。
例如:
spl_autoload_register(function ($class) {
// ...
$class = stream_resolve_include_path(sprintf("%s.php", $class));
if ($class !== false) {
require $class
}
});
$class
将包含要加载它的类,因此,您可以使用它在文件系统中查找包含此类的文件。
答案 1 :(得分:1)
您正在以错误的方式使用自动加载器。它只应该加载特定请求所需的类,而不是整个文件夹。
通过一些很好的例子,详细了解自动加载类:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md