解析composer自动加载机制
原由
这几天在网上随便找了个简洁的接口框架,没想到简洁得过头了。没有配置文件,没有数据库调取,也没有单独的控制器,模型模块。然后自己一通的封装。用着倒是没问题,只是太多的文件引用了。显得很Low。于是想到了自动加载。由于框架本身就是用composer组合的几个模块拼凑在一起的,所以首选还是用composer来配置安装自动加载。四种加载方式最开始先不说开发层面,而是普及下composer自动加载的几种方式。一、files方式
这种是比较原始的方式了,跟用require其实差不多,只能加载配置好的单独文件。{autoload:{files:〔srcMyLibraryfunctions。php〕}}二、Classmap方式
这种加载方式就有点升级了,可以扫描指定目录下的所有php,ini文件中的class,有点像批量加载。而且这种方式辨识度很高,使用composer执行更新自动加载后,直接能看到引用了多少个文件,在vendorcomposerautoloadclassmap。php文件里也能明显看到是否引入了目标文件。{autoload:{classmap:〔src,lib,Something。php〕}}三、PSR0
到这一步已经快跟上时代了。因为前面说的两种,都是强制加载。不管用得着用不着的类,只要配置在加载列表里就会引入文件,而现在说的呢,只有实例化的类才会触发引入,在指定目录寻找对应的引用文件从而实例化类。{autoload:{psr0:{Foo:src}}}PSR4
主角终于登场了,这就是今天要说的重点。比起上一种其实区别不大,只有方式名称0和4的区别。加载机制也一样。无非就是新的命名规范简化了目录。这个我是懒得去深究了,只是知道这就是我想要的。{autoload:{psr4:{Controller:app}}}使用方法
使用方法很简单,不做太详细介绍。前面的几种方法里都有关键代码。把这些关键代码放在项目下的composer。json里,然后在该文件目录下执行命令composerdumpautoload,以及composerinstall就Ok了。也可以在vendorcomposer下的对应的文件里查看,是否配置成功。
解析PSR4自动加载方式
总算说到代码层面了,通过上面的图片我已经标示出了关键的几个文件。其中涉及psr4加载的是autoloadpsr4。php,autoloadstatic。php。关于static这个文件我先卖个关子,稍候再提及。那么composer到底是怎样实现自动加载呢?小编要开讲了。第一步当然是要引入autoloadreal。php,然后再通过ClassLoader。php文件根据不同的加载方式,引入不同的文件。咱们要讲的就是ClassLoader。php里面的一段逻辑。
第一步,先从319行的loadClass方法开始执行,然后执行335行的findFile方法。最后来到了findFileWithExtension方法,即终点了。后面的几种方式就不提了,只解说372行到391行的psr4方式的自动加载。敲黑板了,注意噢。
比如实例化newControllercontrollerhomeController(),注意这里的Controller是命名空间,controllerhomeController是命名空间所在路径下的相对路径。首先373行对实例的类名拼接成文件名,ControllercontrollerhomeController。php;375行,取出拼接的文件名的首字母A,接下来376行出现了第一次流程判断,thisprefixLengthsPsr4里包含什么东东呢。这时候就回到了前面说到了autoloadstatic。php文件。下面贴出里面的关键代码publicstaticprefixLengthsPsr4array(Zarray(ZendDiactoros15,),Sarray(SlimTests11,SlimPsr710,Slim5,),。。。。。。Carray(Controller11,),);publicstaticprefixDirsPsr4array(ZendDiactorosarray(0DIR。。。。zendframeworkzenddiactorossrc,),SlimTestsarray(0DIR。。。。slimslimtests,),。。。。。。Controllerarray(0DIR。。。。。。app,),);。。。。。。通过上面的代码就比较清晰了,原来配置生效后,composer把psr4的配置同时写进了autoloadpsr4。php,autoloadstatic。php。在autoloadstatic。php里,写入了两个静态属性,一个是prefixLengthsPsr4也就是配置的命名空间首字母,用来判断是否有该首字母的加载配置(对应376行代码);另一个是prefixDirsPsr4也就是该命名空间首字母指向的文件目录。接着到了379行代码,判断拼接的文件名里是否有分级目录,并在380行代码取到顶级目录位置,controllerhomeController。php。381,382行代码就说到了前面说到的prefixDirsPsr4属性,也就是要寻找的命名空间首字母的指向目录,app。(可能包含多个路径)383行代码,拼接出命名空间下的相对路径,controllerhomeController。php;384到386行代码,就是遍历第5步查到的目录,然后把每个目录与第6步的相对路径拼接,判断是否存在这个文件,如果存在那当然是成功返回了。结语
个人表达水平有限,不知您是否get了。最后说个注意的地方,使用自动加载的文件名称要与实例化时的类名一致,当然文件里面的类名也要一致。还有引入类里写的namespace,要搞清楚当前在命名空间指定目录下的相对位置。
共促算法推荐健康有序发展来源:人民日报海外版大数据改变了人们的生活方式,互联网和算法让我们的行为更容易被量化。你爱点哪家饭店的外卖,喜欢何种类型的短视频,常用的打车路线是什么当人的活动被网络记录,整个……
为什么华为跌倒后,有人宁愿溢价买苹果,也不买性价比高的小米?小米和苹果在一个层次上吗?在国内,只有华为可以压制苹果,其它的加在一块也不够人家打!感谢您的阅读。为什么有人宁愿溢价买苹果,也不考虑性价比高的小米?您的这个问题,可……
2021年华为营收暴跌,消费者业务严重受挫,华为还能站起来吗华为受挫,营收减三成,战略布局,战术转换,何来倒下,还能站起来?任正非民族企业灵魂,国家战略棋子,每走一步都关乎国家利益,大众利益。任正非用毛思想武装头脑,大布局,大穿插大迂回……
现在的你们,还考虑买小米手机吗?不买了,17年买的米6,到现在还是那么流畅,想换个手机都没借口。以前刚工作的时候首选就是小米的千元机,那时候品控还是不错的。15年买过一个红米note2,当时100……
QualifierPriorityPrimary简介在日常开发中,我们通常采用Autowired注入bean,该注解默认是根据类型来自动注入的。但有些情况比较特殊,例如同一个接口可能会有几种不同的实现类,此时如果没有特殊指定,s……
币圈一日资讯1。杭州互联网法院:用户在元宇宙平台发布NFT平台应尽到审查义务;2。英国金融行为监管局已任命数字资产部门临时负责人;3。Coinbase网站出现OptimismT……
优质旗舰手机产品价格下滑,144hz55W,进入中端市场手机市场小众市场上其实也是有着非常多的好产品的,但是由于消费者们往往能看到的广告资源都被大厂占据了,而且大家对于小众市场品牌的信任度也不高。现在的国内的手机市场,一……
外媒博弈的结果,高通华为赢了,美国输了一直以来,在芯片研发和制造上,最为领先的都是美国。简单地说,世界上大部分国家用的芯片都来自美国企业,但这确实是以前的状态,现在这样的状态显然已经不再。随着全球芯片研……
3个理由告诉你洗碗机为什么值得买2021年年初,国内大数据平台发布了2020年中国洗碗机零售报告,报告显示受疫情影响国内出现了一定规模的消费降级,但是洗碗机品类却逆势增长31,销售量达到了191。9万台。20……
Python文件读写原理理解文件中的读取或者写入顺序要先知道对文件进行读写时它的工作模式:在python中对文件进行读写时,是依据文件中光标的位置进行读写的。这里就要引入seek()方法:……
5。6万台矿机罗生门华铁应急遭亿邦国际实名举报,老板娘被指私本文来源:时代周报作者:周梦梅5。6万台矿机,到底去哪儿了?两家上市公司各执一词,对簿公堂。一方的董事长甚至不惜实名举报,引发舆论争议。8月9日早间,华铁应急(60……
为什么安卓已经放弃了3D人脸解锁,只有苹果还在坚持?2017年苹果推出了iPhoneX,这是苹果第一款全面屏手机,并引入了刘海设计,在显眼的刘海内部,苹果集成了多种传感器,其中就包含FaceID模组,也就是大家常说的3D人脸解锁……