php如何通过spl_autoload_register自动加载类定义?
发布于 作者:苏南大叔 来源:程序如此灵动~说起php里面autoload
自动加载功能,是非常的实用。如果你不懂的自动加载是什么意思,那么你一定知道php里面无处不在的require_once
或者include_once
。对,autoload
其实说白了,其实就是可以自动执行require
系列函数。
在php7.2全面到来的今天,这个功能就体现为函数:spl_autoload_register()
,本函数最早出现于php5.1
。
spl_autoload_register()
vs __autoload()
一直以来,自动加载功能都是通过在文件中定义函数__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');
通过类静态方法加载的方案
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
相关文章,请点击下面这个链接查看:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。