verdor/composer/目录下有四个配置文件:
- autoload_classmap.php: 要加载的class映射
- autoload_files.php: 要加载的文件
- autoload_namespaces.php: psr-0标准
- psr4.php: psr-4标准
getLoader()这个方法会先把这些配置文件放到ClassLoader的私有属性中。
然后通过$loader->register(true);来调用spl_autoload_register()
spl_autoload_register()把loadClass()方法注册到了autoload队列中,然后当PHP引擎试图实例化未知类的操作时,就会根据类名和命名空间加载这个类文件。
调用了\Composer\Autoload\ClassLoader的
loadClass()->findFile()
。在findFile中,查找顺序是:
classmap->psr4->psr0
,找到的话就返回类文件的路径名。
spl_autoload_register + namespace 自动加载主流。所以用namespace就能找到详细的路径,从而找到类文件。
psr-0 与psr - 4 的不同
- PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线_会被转化成目录分隔符。
- composer的PSR-4带来更简洁的文件结构。
- 参考:PSR-4——新鲜出炉的PHP规范
总结: 1. 命名空间前缀对应相应的文件夹 2. 类名和文件名相同,文件后缀为PHP
psr-4
{
"psr-4" : {
"Foo\\": "src/"
},
}
按照PSR-4的规则,当试图自动加载 “Foo\Bar\Baz” 这个class时,会去寻找 “src/Bar/Baz.php” 这个文件,如果它存在则进行加载。
prs-0
{
"psr-0" : {
"Foo\\": "src/",
},
}
PSR-0有此配置,那么会去寻找 “src/Foo/Bar/Baz.php”
PSR-0当试图自动加载 “Foo\A_B” 这个class时,会去寻找 “src/Foo/A/B.php” 这个文件.
参考链接http://www.tuicool.com/articles/mARrMj6
classmap
{
"autoload": {
"classmap": [
"database"
],
}
}
classmap 做的是类名和文件所在位置的映射
写的很好的一个关于composer的文章 https://laravel-china.org/topics/1002
文章来源: http://hanfeng.name/blog/2015/08/17/composer-autoload/