我使用这个简单的自动加载器代码:
function __autoload( $class_name ) { include 'class.' . $class_name . '.php'; }
我打了这个电话new SDB();
SDB
实际上继承自SDBOne
,我从未包含......但是自动加载器会加载它。
这意味着它知道加载嵌套/包含在其他模块中的模块。
所以从它的外观来看,如果我使用自动加载器,我就不需要或包含任何内容。
但是,如果我使用一个没有自动加载器的独立模块,那么我需要包含它继承的类。
我应该使用
require,
require_once,
include,
include_once.
我想与require_once
一起使用,因为我想要一个错误而不是一个警告...加上当我使用自动加载器的代码时,我不希望它加载两次。
基本上我有两种类型的SDB用途:一种是自动加载器存在,另一种是out。
参考
答案 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
时这一点尤其重要;如果另一个自动加载器最终负责加载有问题的类,你不希望你的自动加载器发出关于丢失文件的不必要的警告。
希望有所帮助。