PHP的spl_autoload_register和__autoload有什么区别?

30

使用这个除了我们可以使用自己的名称自动加载之外,还有什么区别吗?它们在性能上有什么差异?它们内部是如何工作的?

之间的区别

function __autoload_libraries($class){
    include_once 'lib.'.$class.'.php';
}

spl_autoload_register('__autoload_libraries');

对比

function __autoload($class){
    include_once 'lib.'.$class.'.php';
}
2个回答

56

__autoload 通常被认为已经过时。它只允许注册一个自动加载器。通常情况下,如果你正在使用支持 spl_autload_register 的 PHP 版本,你应该只使用 __autoload

spl_autoload_register 允许注册多个自动加载器,这些加载器将被依次运行,直到找到并加载与之匹配的类/接口/特性,或者所有自动加载选项都已耗尽。这意味着,如果你正在使用框架代码或其他第三方库,这些库实现了它们自己的自动加载器,你不必担心你的自动加载器会引起冲突。

更新:

自 PHP 7.2.0 开始,__autoload 现已正式弃用,这意味着它已经处于被淘汰的状态。如果你想让你的代码与未来版本的 PHP 兼容,你绝对不应该使用 __autoload


1
我在http://php.net/manual/en/function.spl-autoload-register.php上找不到任何好的例子来做这件事,当我尝试时,它会在包含autoload one文件后加载其他autoload two。 - Adam Ramadhan
在我看来,如果在命名空间或类内部使用而不是全局使用,__autoload()似乎比spl_autoload_register()更方便。 这样,自动加载函数运行时将始终知道它是从哪个NS调用的,并且可以轻松处理本地/共享/核心类的分层文件夹结构... 旧式的NS_Class命名和根目录的多个包含路径使得某些方面比使用composer要容易得多.. :/ - Christoffer Bubach

3
“自动加载类”的文档中指出:
spl_autoload_register() 提供了一个更灵活的自动加载类的替代方法。因此,不建议使用 __autoload(),未来可能会被弃用或移除。 spl_autoload_register() 的文档中指出:
如果需要多个自动加载函数,则可以使用 spl_autoload_register()。它有效地创建了一个自动加载函数队列,并按照定义顺序依次运行每个函数。相比之下,__autoload() 只能定义一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接