小编给大家分享一下作曲家自动装载的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
众所周知<代码> 代码>是作曲家现代PHP项目的基石,与古老的<代码>梨> 代码不同,<代码>作曲家> 代码并不是一款专注于系统级别PHP管理的包管理系统,而是基于项目的一个库管理系统。这就好比<代码> npm安装- g代码>和<代码> npm安装> 代码的区别。而且最主要的是<代码>梨> 代码不太能跟上时代的潮流,在大家都在用<代码> psr - *> 代码的时候<代码>梨> 代码依然我行我素自成一体。
好吧,可能这是好事,但是也是坏的事。好事是很多优秀的包都从<代码>梨> 代码发家致富,比如<代码> PHP_CodeSniffer 代码>,<代码> PHP_Unit> 代码等等。但是随着时代的发展,PHP社区也渐渐地从其他社区汲取到了一些精华,慢慢地向前发展。最近的<代码> laravel> 代码就是直接扔进了<代码> 代码>作曲家,因为<代码> psr-4 代码>这个规范真是不能再爽更多。这真的是我用各种包用得最顺手的一套命名规范了。
扯远了,扯回<代码>供应商/作曲家/autoload_real。php代码>这个核心<代码> 代码>作曲家文件。
自动加载的类型
总体来说作曲家提供了几种自动加载类型
- <李>
classmap
李> <李>psr-0
李> <李>psr-4
李> <李>文件
李>这几种自动加载都会用的到,理论上来说,项目代码用<代码> psr-4> 代码自动加载,辅助<代码> 代码>用<代码>文件代码>自动加载,<代码> 代码>发展相关用<代码> classmap> 代码自动加载。<代码> psr-0> 代码已经被抛弃了,不过有些历史遗留依然在用,所以偶尔也会看的到。
classmap
这应该是最最简单的自动装载模式了。大概的意思就是这样的:
{ “classmap"才能:,(“src/? }
然后作曲家在背后就会读取这个文件夹中所有的文件然后再<代码>供应商/作曲家/autoload_classmap。php代码>中怒将所有的<>强类强>,的名称空间+ classname生成成一个关键=比;价值的php数组
& lt; php ? [return & # 39;才能应用\ \ \ \控制台内核# 39;,=祝辞,baseDir 美元;只& # 39;/App/控制台/Kernel.php& # 39; ]; ?在
然后就可以光明正大地用<代码> spl_autoload_register 代码>这个函数来怒做自动加载了。
好吧上面的例子其实有点棘手就是上面这个自动装载实际上是根据prs-4来生成出来的。不过这不重要,了解底层重要的点,我们可以看到所有的所谓的半自动的其实可以理解为生成了这么一个<代码> classmap> 代码,这是<代码>作曲家dump-autoload - o> 代码做的事儿。不然的话<代码> compoesr> 代码会吭哧吭哧地去动态读取psr-4和prs-0的内容。
psr-0
现在这个标准已经过时了。当初制定这个标准的时候主要是在php 5.2从刚刚跃迁到5.3 +有了命名空间的概念,所以这个时候<代码> psr-0> 代码的标准主要考虑到了& lt; 5.2的php中类似<代码> Acme_Util_ClassName 代码>这样的写法。
{ “name"才能:,“acme/util" “才能auto",:, { ,,,“psr-0":, { ,,,,,“Acme \ \ Util \ \“:,“src/? ,,,} ,,} }
文档结构是这样的
供应商/,acme/,,util/,,,,composer.json ,,,,src/,,,,,,,Acme/,,,,,,,,,Util/,,,,,,,,,,,ClassName.php
名称。php中是这样的
& lt; php ? class Acme_Util_ClassName {} ?在
我们可以看到由于旧版本的php没有名称空间所以必须通过<代码> _ 代码>将类区分开。
这样稍微有点麻烦。指向一个文件夹之后<代码> src> 代码还要在<代码> src> 代码中分成好几层文档树。这样太深了。没有办法,但是似乎想要兼容<代码> _ 代码>的写法仔细想想这是唯一的办法了。(psr-0要求半自动的的时候将类中的<代码> _ 代码>转义为& # 39;\ & # 39;)
所以在php5.2版本已经彻底被抛弃的今天,<代码>图> 代码就怒推出了<代码> psr-4 代码>
psr-4
这个标准出来的时候一片喷声,大概的意思就是<代码>图> 代码都是傻逼么,刚刚出了<代码> psr-0 代码>然后紧跟着进推翻了自己,不过图也有自己的苦衷,帮没有名称空间支持的php5.2擦了那么久的屁股,在2014年10月21日的早晨,终于丢失了睡眠。