如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

说起php里面autoload自动加载功能,是非常的实用。如果你不懂的自动加载是什么意思,那么你一定知道php里面无处不在的require_once或者include_once。对,autoload其实说白了,其实就是可以自动执行require系列函数。

在php7.2全面到来的今天,这个功能就体现为函数:spl_autoload_register(),本函数最开始出现于php5.1

spl_autoload_register() vs __autoload()

php如何通过spl_autoload_register自动加载类定义 - php-ice

一直以来,自动加载功能都是通过在文件中定义函数__autoload()来实现的。不过,从php5系列开始,出现了一个新的函数,spl_autoload_register(),慢慢取代__autoload()函数的统治格局。

  • spl_autoload_register()可以执行多次,也就是说可以定义很多个autoload规则。
  • __autoload()函数,只能定义一次,第二次定义就会报错了。

而在最新的php72中,spl_autoload_register()已经完全占据了市场份额。当然,并不是说,不可以定义__autoload()函数,只是在最新的php72中,它已经失去了其专属功能设定,必须依靠spl_autoload_register()才能继续完成其历史使命。

既然,主流的php都已经支持spl_autoload_register(),而且最新的php72已经废弃__autoload()。那么,我们的选择,就并不需要纠结了,对吧?

spl_autoload_register()整体说明

从php官方文档上,大家可以发现,它有三个参数。但是大多数情况下,自会设置其第一个参数,也就是说,具体的autoload的相关逻辑,这个逻辑就是仁者见仁智者见智了。大家的思路不同,这个函数的实现就并不一致。

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
  • 第一个参数autoload_function,就是autoload函数逻辑的具体实现。
  • 第二个可选参数throw,指的是autoload函数加载失败的时候,是否抛出异常。这个参数有点匪夷所思...
  • 第三个可选参数prepend,设置为true的时候,会把当前autoload规则添加到队列之首,而不是默认的队尾。
  • 成功时,返回true,失败返回false。

下面给出几种方案,适用于第一个参数autoload_function的几种变化。当然,其具体的load逻辑,方案中都是用//todo...代替,因为这毕竟是个仁者见仁智者见智的问题。如果您要纠结这个事情的话,其实就是用require函数包含到你的正确的文件路径就可以了。

套路上,就是类似下面这样的:

function load($class){
  require($class.".php");
}
spl_autoload_register("load");
$demo=new TheClass();

通过函数加载的普通方案

function load_normal($class) {
    echo("普通加载的模式加载:".$class."<br/>");
    // todo ..
}
spl_autoload_register('load_normal');

php如何通过spl_autoload_register自动加载类定义 - load

通过类静态方法加载的方案

class load1 {
  public static function autoload($class) {
    echo("类静态方法模式加载:".$class."<br/>");
    // todo ..
  }
}
spl_autoload_register(array('load1', 'autoload'));
//spl_autoload_register('\load1::autoload');

php如何通过spl_autoload_register自动加载类定义 - load1

通过类普通方法加载的方案

class load2 {
  public function autoload($class) {
    echo("类普通方法模式加载:".$class."<br/>");
    // todo ..
  }
}
spl_autoload_register(array(new load2(), 'autoload'));

php如何通过spl_autoload_register自动加载类定义 - load2

匿名函数加载的方案

spl_autoload_register(function ($class) {
    echo("匿名函数的模式加载:".$class."<br/>");
    // todo ..
  }
);

php如何通过spl_autoload_register自动加载类定义 - load3

总结

由于篇幅限制,苏南大叔在这里就说一下第一个参数autoload_function,其他的不常用参数将在spl_autoload_register()的进阶版本中进行阐述。

更多相关spl_autoload_register相关文章,请点击下面这个链接查看:

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。