首先恭喜你们,包括我本身,坚持到了如今。这篇文章以后,Composer的基础原理就清晰明了咯。也就是说,Composer所利用的正是spl_autoload_register()和PSR4规范,而后经过线上服务器存储包,来实现包管理的功能。spl_autoload_register()的做用咱们已经清楚了,主要就是动态加载咱们所须要的文件。然而咱们的文件不可能都乱七八糟的随便找个目录放下,而后注册一堆的spl_autoload_register()来加载吧,要真这么写,估计你的老板会废了你。在这个时候,PSR路径规范的做用就显示出来咯!!php
本文参考PSR规范:psr.phphub.org/git
\<命名空间>(\<子命名空间>)*\类名github
具体的内容直接上文中提供的参考连接,这里总结重要的几点:服务器
估计各位看得一脸懵逼吧!!composer
其实很好理解,举例说明,咱们先创建一个目录叫myvendor,里面放着经常使用的工具包,如图:工具
那么TestClass.php的命名空间应该是Test,而CaseClass的应该是CaseModel\CaseChild。统一从myvendor这个文件夹做为入口进入。也就是myvendor是一个超级[基目录],而后Test和CaseModel是对应命名空间的两个[文件基目录],剩下的子个名空间与目录对应。官网中还有其余的展现方式,但在这里咱们用这种最标准的方式。学习
其实说白了,就是命名空间和目录对应上,写代码找文件就方便得很啦!!ui
上面说的是PSR4的规范,那么PSR0又是什么鬼?目前来讲PSR0已经废弃了,它们两个大部份内容仍是相近的,最大的区别在于PSR0中的_这个符号是有意义的,也就是/namespace/package/Class_Name这样的内容,会去提供/namespace/package/Class/Name.php文件,而PSR4中则忽略_这个符号的意义,仍是去查找Class_Name.php这个文件。spa
TestClass.php代码code
<?php
namespace Test;
class TestClass {
public function show() {
echo "we are family!\n";
}
}
复制代码
CaseClass.php代码
<?php
namespace CaseModel\CaseChild;
class CaseClass {
public function show() {
echo "Good!\n";
}
}
复制代码
接下来,在myvendor目录外面添加一个psr4.php文件,代码以下:
<?php
spl_autoload_register(function ($class) {
$vendor = __DIR__ . '/myvendor';
$file = $vendor . '/' . str_replace('\\', '/', $class) . '.php';
if (file_exists($file)) {
require $file;
}
});
use CaseModel\CaseChild\CaseClass;
use Test\TestClass;
$t = new TestClass();
$t->show();
$c = new CaseClass();
$c->show();
复制代码
神奇的事情发生了,文件自动加载进来了,有点高大上吧,至此,关于Composer的自动加载部分就结束了。咱们一块儿学习到了PHP是如何经过spl_autoload_register方法来自动加载文件,而且经过PSR4规范来造成约束,让你们都有一套统一的规范。而这些,正是Composer的灵魂和肉身。