本系列的第二篇文章,这次咱们聊聊:spl_autoload_register()函数

PHP的SPL库作为扩大库,曾经于5.3.0版本后默认放弃开启,成为PHP的一组弱小的外围扩大库。大家有工夫能够多钻研钻研SPL外面的办法性能。而且,SPL中蕴含很多类库哟,在设计模式的系列文章中,咱们也会再次见到他们的身影!

这回咱们建设一个文件,叫做spl_autoload_register.php,而后将上面的代码复制进去吧:

<?phpspl_autoload_register(function( $className ){    require $className . '.php';});$m = new TestClass();$m->show();

是不是和__autoload()很像,当然作用也很像。咱们间接运行这个文件试试,会发现TestClass.php也失常的加载了进来。那么为啥不间接用__autoload()函数,而应用sql_autoload_register()这么诡异的函数,而且还有个神奇的闭包参数!!!

咱们先看看它的定义和格局

PHP官网文档中的定义

注册给定的函数作为 __autoload 的实现

没错,那个匿名函数就是一个__autoload()函数,咱们能够了解为给以后这个PHP文件中注册一个__autoload()函数,而应用匿名函数的起因呢?当然就是为了闭包个性,最次要的就是可能带来提早加载(懒加载 )的实现!

另外,spl_autoload_register()函数不止是仅仅去注册一个__autoload(),它实现并保护了一个__autoload()队列。原来在一个文件中只能有一个__autoload()办法,但当初,你领有的是一个队列。

函数格局

spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool

有点长,咱们一步步看:

  • callable $autoload_function:闭包函数,不多解释了,下面曾经说了,不理解闭包函数的作用能够百度百度
  • bool $throw:当$autoload_function无奈胜利注册时,是否抛出异样
  • bool $prepend:如果是true,将会增加一个__autoload()函数到队列的顶部
  • 这个函数有返回值,胜利或失败

革新代码

嗯,到这里如同有点简单了,咱们须要革新革新代码这样能力让大家看得更清晰,先筹备另一个须要加载 的类文件,就叫CaseClass.php好了

<?phpclass CaseClass{    public function show()    {        echo "Good!\n";    }}

而后批改spl_autoload_register.php文件

<?php// 应用匿名函数形式spl_autoload_register(function( $className ){    echo "first==>\n";    require_once 'TestClass.php';});// 须要注册的内部__autoload()实现spl_autoload_register('CaseAutoLoad');function CaseAutoLoad( $className ){    echo "second==>\n";    require_once 'CaseClass.php';}$m = new TestClass();$m->show();echo "--------\n";$s = new CaseClass();$s->show();

什么都别说了,间接运行吧,如果有报错请查看下哪里写错了,反正我这里没错~~

失常状况下应该输入这样的内容

  1. "first==>"是咱们原来的spl_autoload_register()函数输入的内容,这里咱们没有应用$className来动静加载,而是只加载TestClass.php这一个文件
  2. 接下来咱们便输入了TestClass外面的show()办法的内容。须要留神的是:这里可还没有加载CaseClass.php这个文件哦,也就是当初咱们曾经实现了懒加载了哦
  3. 接下来,咱们想要实例化CaseClass对象,于是spl_autoload_register()保护的队列发挥作用了。先走第一条,利用require_once()对于之前曾经加载过的TestClass.php不会再次加载了。然而这一个文件中并没有找到咱们须要的CaseClass对象,于是咱们进入了队列第二条,来到了CaseAutoLoad()办法中,CaseClass.php终于在这个办法中被require_once()进来了

到这里,你曾经晓得了这个函数最大的作用就是保护的这个队列并且能够提早加载咱们须要的文件。是不是感觉有点要走上人生巅峰了?不不不,你心里或者还在纳闷,这玩意跟Composer有啥关系?

请在您须要测试的目录初始化一个Composer

  • 进入vendor/composer/autoload_real.php中
  • 在getLoader()办法中马上就能发现spl_autoload_register()办法
  • 而后在最底下有个$loader->register(true);办法-- 简略的浏览代码咱们发现其实这个$loader就是ClassLoader类
  • 进入ClassLoader.php文件中,找到register()办法- 没错,外面还是一个spl_autoload_register()办法,这样来看,这货就是Composer的灵魂啊!!

OK,走到这里,其实在面试的时候就能够跟面试官司吹牛了,Composer的原理?spl_autoload_register()办法嘛。说不定的确有不少人就被你唬住了,然而,对于Composer来说,咱们还有一个十分重要的方面不能疏忽,能够将它看作是Composer的血肉,让主动加载可能无形,成为一个有灵魂有躯体的残缺的人,这就是PSR标准中的PSR0和PSR4标准,下篇咱们就聊聊这俩货!

残缺源码:GitHub

===============

关注公众号:【硬核项目经理】获取最新文章

增加微信/QQ好友:【xiaoyuezigonggong/149844827】收费得PHP、项目管理学习材料

知乎、公众号、抖音、头条搜寻【硬核项目经理】

B站ID:482780532