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

通过上两篇文章的内容,大家可以了解到php的自动加载函数spl_autoload_register的基本使用方法,具体可以查看文末链接。在本篇文章中,苏南大叔继续和大家探讨一下:spl_autoload_register()的高级用法。苏南大叔将之描述为spl_autoload_register()truefalse的那些事儿。

苏南大叔:php如何理解spl_autoload_register的true和false? - php如何理解spl_autoload_register的true和false
php如何理解spl_autoload_register的true和false?(图3-1)

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。那么就肯定能触发这个加载失败的错误了。

  • throwtrue的时候,spl_autoload_register抛出了个Fatal error: Uncaught LogicException,程序停止执行。
  • throwfalse的时候,spl_autoload_register没有抛出异常,但是class调用处抛出的一个异常Fatal error

苏南大叔:php如何理解spl_autoload_register的true和false? - fatal_error
php如何理解spl_autoload_register的true和false?(图3-2)

第二个参数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();

苏南大叔:php如何理解spl_autoload_register的true和false? - autoload_order
php如何理解spl_autoload_register的true和false?(图3-3)

从截图上可以看到:本来在最后面的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系列经验文章,请点击下面的链接查看。

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

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

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

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