关于php:深入学习Composer原理二

31次阅读

共计 2619 个字符,预计需要花费 7 分钟才能阅读完成。

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

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

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


<?php

spl_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 好了

<?php

class 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

正文完
 0