php如何理解spl_autoload_register的true和false?
发布于 作者:苏南大叔 来源:程序如此灵动~通过上两篇文章的内容,大家可以了解到php的自动加载函数spl_autoload_register
的基本使用方法,具体可以查看文末链接。在本篇文章中,苏南大叔继续和大家探讨一下:spl_autoload_register()
的高级用法。苏南大叔将之描述为spl_autoload_register()
的true
和false
的那些事儿。
spl_autoload_register()
的参数
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
这里先小小的回顾一下spl_autoload_register()
函数。一共三个参数,一个返回值。第一个参数,是个函数,定义了如何找到一个类的定义文件。第二个参数和第三个参数都是个布尔类型的参数,返回值也是个布尔类型。
本文描述的就是上述三个布尔类型,即:spl_autoload_register()
函数的第二个和第三个参数,以及函数的布尔返回值。
第二个参数throw
第二个可选参数throw
,类型是布尔类型,指的是autoload_function
函数加载失败的时候,是否抛出异常。
这个参数有点匪夷所思...,这个autoload_function
函数怎么会加载失败呢?下面的这个代码,是苏南大叔的测试代码。但不难覆盖所有的异常情况,不排除实际编码过程中,会有其它的意外情况发生。
//spl_autoload_register('nonexist_autoload_function',true);
spl_autoload_register('nonexist_autoload_function',false);
$test = new \mynamespace\myclass();
在上面的例子里面,苏南大叔试图注册一个根本不存在的函数spl_autoload_register
。那么就肯定能触发这个加载失败的错误了。
throw
为true
的时候,spl_autoload_register
抛出了个Fatal error: Uncaught LogicException
,程序停止执行。throw
为false
的时候,spl_autoload_register
没有抛出异常,但是class
调用处抛出的一个异常Fatal error
。
第二个参数prepend
prepend
参数比较好理解,就是强制插队的意思。强制把当前autoload函数插队到一系列函数的顶部。也就是说,一旦发生寻找class
的事情的话,就会优先第一个使用当前这个优先级高的插队规则。
苏南大叔忽然意识到:这个参数是个用于注入已有php框架的好手段啊.... 强制插队注册一个优先级高autoload规则, 然后就可以强势改变已有代码的逻辑走向了。没做测试,留待以后实践上检测。
spl_autoload_register(function ($class) {
echo("试图1号规则加载:" . $class . "<br/>");
});
spl_autoload_register(function ($class) {
echo("试图2号规则加载:" . $class . "<br/>");
});
spl_autoload_register(function ($class) {
echo("试图3号规则加载:" . $class . "<br/>");
}, false, true);
$test = new \mynamespace\myclass();
从截图上可以看到:本来在最后面的3号规则,被强势修改了权重值,插队到了最前面...
返回值true/false
这个返回值true
/false
,说起来也是和第二个参数throw
有点关系的。如果第二个参数throw
设置为false
,不报错了。但是仍然不难掩盖这个规则加载失败的错误,对不?返回值来做判断即可。
而且从下面的范例代码中,我们可以得出结论:无论autoload_function
里面是否实现加载class
的动作,即使是个空操作,这个spl_autoload_register()
也是可以返回true
的。有点不智能,是不是?
$result1 = spl_autoload_register('nonexist',false);
$result2 = spl_autoload_register(function(){},false);
var_dump($result1);
var_dump($result2);
$test = new \mynamespace\myclass();
相关文章
- 《php如何通过spl_autoload_register自动加载类定义》
https://newsn.net/say/php-autoload.html
- 《php如何实现spl_autoload_register具体load逻辑》
https://newsn.net/say/php-autoload-function.html
结论
true
或者false
的世界,真的有那么多是是非非,对对错误么?佛系看代码,也许真相并不是你想象的那样...
更多autoload
系列经验文章,请点击下面的链接查看。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。