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

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

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(图2-1)

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

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

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

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

苏南大叔需要你的支持

打赏任意金额,发送截图到邮箱 shang@newsn.net ,可以领取精选回馈如下(任选其一):
  • 《前端视频教程大礼包》一套
  • 《wordpress精选皮肤》一套
  • 《dedecms织梦精选模板》一套
感谢您的打赏,让我更有动力,将更多精彩教程文章,呈现给大家!谢谢!

岁月静好

关注互联网发展,关注苏南大叔的《程序如此灵动~》博客
本文章来自:程序如此灵动~
博客地址为:https://newsn.net/
原文地址为:https://newsn.net/say/php-autoload-bool.html
上一篇好文:php如何实现spl_autoload_register具体load逻辑
下一篇好文:chrome如何利用插件改变charset字符编码?

如果您转载了本文章,出于某种原因,并没有注明作者或者出处。
在这里,苏南大叔也表示理解和支持。因为苏南大叔深深地明白:
您会在合适的时机,合适的地方,给本博客一个外链。对吧?
您若开心,便是安好!岁月静好,但愿世界和平,没有纷争~