Autoloader似乎是无所不知的嵌套包括不需要

时间:2012-08-07 22:29:18

标签: php autoloader

我使用这个简单的自动加载器代码:

function __autoload( $class_name ) { include 'class.' . $class_name . '.php'; }

我打了这个电话new SDB();

SDB实际上继承自SDBOne,我从未包含......但是自动加载器会加载它。

这意味着它知道加载嵌套/包含在其他模块中的模块。

所以从它的外观来看,如果我使用自动加载器,我就不需要或包含任何内容。

但是,如果我使用一个没有自动加载器的独立模块,那么我需要包含它继承的类。

我应该使用

require,

require_once,

include,

include_once.

我想与require_once一起使用,因为我想要一个错误而不是一个警告...加上当我使用自动加载器的代码时,我不希望它加载两次。

基本上我有两种类型的SDB用途:一种是自动加载器存在,另一种是out。

参考

http://php.net/manual/en/language.oop5.autoload.php

1 个答案:

答案 0 :(得分:1)

你是对的,require_once是将父类或从属类包含在一个文件中的正确方法。这样,如果多次包含,require_once可以防止因重新声明类而产生的错误。

自动加载器会自动加载SDBOne,因为它需要定义该类才能从中扩展SDB。当您尝试加载继承的类时,会按需自动加载父类。

此外,您应该考虑切换到spl_autoload_register,以便您的代码可以与可能使用自动加载器的其他代码一起使用。 SPL自动加载器支持多个自动加载器,并按其注册顺序创建堆栈。这样,如果第一个自动加载器不满足要求,它会继续尝试后续注册的自动加载器,直到加载或无法找到类。

关于防止错误的另一个注意事项,您可能希望更改自动加载功能,如下所示:

function __autoload( $class_name ) { 
    $file = 'class.' . $class_name . '.php';
    if (file_exists($file)) {
        include $file;
    }
}

因为如果不存在自动加载的类,则会出现包含不存在的文件的错误。使用spl_autoload_register时这一点尤其重要;如果另一个自动加载器最终负责加载有问题的类,你不希望你的自动加载器发出关于丢失文件的不必要的警告。

希望有所帮助。