>[info]总结:
PSR-0与PSR-4自动加载格式: root命名空间:起始路径(从composer.json同级目录算起)
~~~
"psr-0 | 4":{
"root命名空间\\":"起始路径",
},
~~~
## **PSR-0:**
例子:
~~~
"psr-0":{
"church\\":"./src/",
},
~~~
此定义的类文件必须定义在composer.json同级目录下的src/church/文件夹下:
>[info]起始路径+root命名空间 + \[额外路径\] + 类文件(必须与类名完全一致)
>[danger] 不光是类文件,还有文件夹这些都对大小写敏感
> 实例化调用时记得加载composer的autoload.php
```
test 应用目录
├─src目录
│ ├─church目录
│ │ ├─TestClass1.php
│ │ ├─TestClass2.php
│ │ └─ ... 更多类文件
│ └─
├─composer.json composer 定义文件
```
定义映射的类:
>[info]类名与文件名完全一致 且 类名必须声明 namespace root命名空间\[\\额外路径
```
namespace church;
class TestClass1{
}
```
使用:
>[info]use root命名空间\[\\额外路径\]\\类名;
new 类名();
或者完全限定
>[info]new \\root命名空间\[\\额外路径\]\\类名()
```
//注意是文件与的类文件及类大小写一致,不只是其中一个
use church\TestClass1;
new TestClass1();
//或者直接new
new \church\TestClass1();
```
例子2:
```
//类文件必须定义在composer.json同级目录下的src/church/Dash/文件夹下
"psr-0":{
"church\\Dash\\":"./src/",
},
```
定义:
```
namespace church\Dash;
class TestClass1{
}
```
使用:
```
//注意是文件与的类文件及类大小写一致,不只是其中一个
use church\Dash\TestClass1;
new TestClass1();
//或者直接new
new \church\Dash\TestClass1();
```
例子3同理:
```
//类文件必须定义在composer.json同级目录下的Church/文件夹下
"psr-0":{
"Church\\":"",
},
```
定义:
```
namespace Church;
class TestClass1{
}
```
使用:
```
//注意是文件与的类文件及类大小写一致,不只是其中一个
use Church\TestClass1;
new TestClass1();
//或者直接new
new \Church\TestClass1();
```
## **PSR-4:**
>PSR-4 相对于PSR-0 在对应文件路径时可以省略root命名空间
对应文件路径:
>[info]起始路径+ \[额外路径\] + 类文件(必须与类名一致)
例子1:
~~~
"psr-4":{
//"root命名空间\\":"起始路径", 例root命名空间 "Dash\\"或者"Dash\\test\\"
"Dash\\":"./src/",
},
~~~
此定义的类文件必须定义在composer.json同级目录下的src及其子文件夹下
>[warning]src/church/TestClass1.php
定义:
~~~
namespace Dash/church;
class TestClass1{
}
~~~
使用:
>use root命名空间\[\\额外路径\]\\类名
>new \\root命名空间\[\\额外路径\]\\类名()
~~~
use Dash\church\TestClass1;
new TestClass1();
//或者直接new
new \Dash\church\TestClass1();
~~~
>[warning]src/TestClass1.php
定义:
~~~
namespace Dash;
class TestClass1{
}
~~~
使用:
~~~
use Dash\TestClass1;
new TestClass1();
//或者直接new
new \Dash\TestClass1();
~~~
例子2:
~~~
"psr-4":{
//"root命名空间\\":"起始路径",
"Dash\\tools\\":"./src/",
},
~~~
此定义的类文件必须定义在composer.json同级目录下的src及其子文件夹下
>[warning]src/TestClass1.php
定义:
~~~
namespace Dash\tools;
class TestClass1{
}
~~~
使用:
~~~
use Dash\tools\TestClass1;
new TestClass1();
//或者直接new
new \Dash\tools\TestClass1();
~~~
>[warning]src/church/TestClass1.php
定义:
~~~
namespace Dash\tools\church;
class TestClass1{
}
~~~
使用:
~~~
use Dash\tools\church\TestClass1;
new TestClass1();
//或者直接new
new \Dash\tools\church\TestClass1();
~~~
psr-4比psr-0路径更简洁
## **files**
>[info]一般用来自动加载函数、配置等非类文件
~~~
"files":[
"src/MyLibrary/functions.php"
],
//以上定义会自动加载与composer.json同文件夹下的src/MyLibrary/functions.php
~~~
## **classmap**
>[info] 适合没有命名空间的类
定义后必须要有src和lib文件夹
~~~
"classmap":[
"src/",
"lib/"
]
~~~
>[info]当Composer开始安装和更新扩展的时候,会根据composer.json里的这个autoload告诉的方式classmap,
来遍历src、lib目录然后将里面的类文件和其路径一一对应,存放到vendor/composer/autoload_classmap.php内
>src/文件下必须有文件并且定义了类才会被加载到classmap
总览:
~~~
"autoload":{
"psr-0":{
//简单理解将./src路径替换为church 所以 src里的类文件必须有namespace church
"church\\":"./src/",
#use church\testClass, 那就对应src/church/testClass.php.
#use church\test\testClass, 那就对应src/church/test/testClass.php
"Test\\" :"core/", #composer update后 ./vender/composer/autoload_psr4.php的 数组里会多出'Test\\' => array($baseDir . '/core'),
"UniqueGlobalClass": "" # 这个类的php源文件也位于包的根目录
},
"psr-4":{
"church\\":"./src/",
# use church\TestClass, 那就对应src/testClass.php.
# use church\Test\TestClass, 那就对应src/test/testClass.php
#
"Dash\\":["extra/","library/"], #多个目录中一个相同的(命名空间)前缀 psr-0 也适用
"":"any/" #任何命名空间(即实例化类时其他地方未定义,那么就会进入any查找) 设置一个目录作为任何命名空间的备用目录psr-0也适用
"thinkcms\\auth\\": "" //加载此composer.json同及目录及其子目录下的的所有文件?
},
"files":[
"src/MyLibrary/functions.php" #一般用来自动加载函数、配置等非类文件
],
#当Composer开始安装和更新扩展的时候,会根据composer.json里的这个autoload告诉的方式classmap,
#来遍历src、lib目录然后将里面的类文件和其路径一一对应,存放到vendor/composer/autoload_classmap.php内
#src/文件下必须有文件并且定义了类才会被加载到classmap
"classmap":[
"src/",
"lib/"
]
}
~~~