我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

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

苏南大叔:php如何通过spl_autoload_register自动加载类定义? - spl_autoload_register
php如何通过spl_autoload_register自动加载类定义?(图2-1)

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

spl_autoload_register() vs __autoload()

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

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

苏南大叔:php如何通过spl_autoload_register自动加载类定义? - php-ice
php如何通过spl_autoload_register自动加载类定义?(图2-2)

而在最新的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');

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

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

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

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

匿名函数加载的方案

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

总结

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

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

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

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    autoload