当前位置: 首页 > 后端技术 > PHP

深入研究Composer原理(二)

时间:2023-03-29 22:36:53 PHP

本系列的第二篇,这次我们讲:spl_autoload_register()函数PHP的SPL库作为扩展库使用,5.3版本后默认开启.0并成为PHP的一套强大的核心扩展库。有时间可以多研究一下SPL中的方法函数。而且SPL中包含了很多类库,我们在设计模式系列文章中还会再见到它们!这次我们创建一个名为spl_autoload_register.php的文件,然后将以下代码复制到其中:$m->显示();是不是很像__autoload(),当然功能也很像。我们直接运行这个文件试试,会发现TestClass.php也正常加载了。那为什么不直接使用__autoload()函数,而是使用sql_autoload_register()这样一个奇葩的函数,而且还有一个神奇的闭包参数!!!我们来看看它的定义和格式。PHP官方文档中的定义是注册一个给定的函数作为__autoload的实现,那个匿名函数就是一个__autoload()函数,我们可以理解为在当前PHP文件中注册了一个__autoload()函数,以及使用的原因匿名函数?当然是为了闭包特性,最重要的是带来延迟加载(lazyloading)的实现!此外,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.phpOk\n";require_once'TestClass.php';});//需要注册外部__autoload()实现spl_autoload_register('CaseAutoLoad');functionCaseAutoLoad($className){echo"second==>\n";require_once'CaseClass.php';}$m=newTestClass();$m->show();echo"-------\n";$s=newCaseClass();$s->show();什么都不说,直接运行。如果有错误,请检查哪里写错了。反正我就在这~~正常情况下应该输出这样的内容。“first==>”是我们原来的spl_autoload_register()函数的输出,这里我们不是使用$className进行动态加载,而是只加载文件TestClass.php。接下来我们输出TestClass中show()方法的内容。需要注意的是,这里还没有加载文件CaseClass.php。也就是说,现在我们已经实现了延迟加载。接下来,我们要实例化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