spl_autoload_register尝试加载具有依赖项的类

时间:2014-01-08 21:10:09

标签: php oop spl-autoload-register

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应该以这种方式运行吗?这些文件夹中的许多其他文件依赖于彼此,自动加载器似乎“弄明白”。我不知道为什么它突然挂在“输入”类上,特别是

2 个答案:

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