【问题标题】:How to use spl_autoload() instead of __autoload()如何使用 spl_autoload() 而不是 __autoload()
【发布时间】:2017-11-23 08:42:53
【问题描述】:

根据http://php.net/manual/en/language.oop5.autoload.php,魔术函数__autoload() 自 PHP 7.2.0 起已弃用,自 PHP 8.0.0 起已删除。

官方替代方案是spl_autoload()。见http://www.php.net/manual/en/function.spl-autoload.php。但是PHP手册并没有说明这个宝贝的正确使用方法。

我的问题:如何将这个(我的自动类自动加载器)替换为带有spl_autoload() 的版本?

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

问题:我不知道如何为该函数指定路径(它只接受命名空间)。

顺便说一下,SO 上有很多关于这个主题的主题,但没有一个提供一个干净简单的解决方案来取代我性感的单线。

【问题讨论】:

  • 我在 PHP 文档中添加了一个基于上述示例的基本示例。希望这样的东西在未来不会那么难找。
  • PHP 手册一点也不烂。
  • @Shikiryu 好吧,老实说,确实如此。在大多数情况下,要理解某些东西是如何工作的并不容易,因为这些文档都是由铁杆书呆子编写的。即使您知道某些东西是如何工作的,也无法理解官方文档。更糟糕的是,在大多数情况下,官方文档都会被更正(!)并被大量的 cmets 重写。诸如 mysqli、cookie 或会话之类的东西很难找到,也很难理解。当您像示例中那样做时,您将失败。这是 IT 和开源的普遍问题:没有可用性。
  • 我完全诚实。医生对我来说似乎很清楚。例如,对于这个特定的问题,选择的答案都写在 you 给出的页面上的“提示”部分中……但是现在,我刚刚看到你大约一年前问过,所以它可能已经改变了.

标签: php deprecated autoload spl-autoloader


【解决方案1】:

您需要使用spl_autoload_register 注册自动加载功能。您需要提供"callable"。从 5.3 开始,最好的方法是使用匿名函数:

spl_autoload_register(function($class) {
    include 'classes/' . $class . '.class.php';
});

这对__autoload 的主要优势当然是您可以多次调用spl_autoload_register,而__autoload(与任何函数一样)只能定义一次。如果你有模块化代码,这将是一个很大的缺点。


2018 年对此进行了更新:您需要滚动自己的自动加载器的情况应该不多。有一个被广泛接受的标准(称为PSR-4)和几个符合要求的实现。这样做的明显方法是使用Composer

【讨论】:

  • 还值得一提的是,将自动加载设为PSR-0 可能是个好主意,这几乎是标准(除了对旧 PEAR 约定的传统支持之外)。如果您正在编写自己的自动加载器,这将使其与一些较大且流行的框架正在执行的操作非常兼容。如果您不想自己编写但使用指定的命名/存储约定,您可以使用现有的自动加载器组件。
  • @lonesomeday 谢谢,这是一个完美的解决方案,可以 100% 替换上述 autoload() 东西。
猜你喜欢
  • 2011-11-30
  • 2012-06-08
  • 1970-01-01
  • 2015-01-23
  • 2010-12-26
  • 2014-09-28
  • 2011-03-12
相关资源
最近更新 更多