🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[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命名空间\[\\额外路径 ``` <?php namespace church; class TestClass1{ } ``` 使用: >[info]use root命名空间\[\\额外路径\]\\类名; new 类名(); 或者完全限定 >[info]new \\root命名空间\[\\额外路径\]\\类名() ``` <?php //注意是文件与的类文件及类大小写一致,不只是其中一个 use church\TestClass1; new TestClass1(); //或者直接new new \church\TestClass1(); ``` 例子2: ``` //类文件必须定义在composer.json同级目录下的src/church/Dash/文件夹下 "psr-0":{ "church\\Dash\\":"./src/", }, ``` 定义: ``` <?php namespace church\Dash; class TestClass1{ } ``` 使用: ``` <?php //注意是文件与的类文件及类大小写一致,不只是其中一个 use church\Dash\TestClass1; new TestClass1(); //或者直接new new \church\Dash\TestClass1(); ``` 例子3同理: ``` //类文件必须定义在composer.json同级目录下的Church/文件夹下 "psr-0":{ "Church\\":"", }, ``` 定义: ``` <?php namespace Church; class TestClass1{ } ``` 使用: ``` <?php //注意是文件与的类文件及类大小写一致,不只是其中一个 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 定义: ~~~ <?php namespace Dash/church; class TestClass1{ } ~~~ 使用: >use root命名空间\[\\额外路径\]\\类名 >new \\root命名空间\[\\额外路径\]\\类名() ~~~ <?php use Dash\church\TestClass1; new TestClass1(); //或者直接new new \Dash\church\TestClass1(); ~~~ >[warning]src/TestClass1.php 定义: ~~~ <?php namespace Dash; class TestClass1{ } ~~~ 使用: ~~~ <?php use Dash\TestClass1; new TestClass1(); //或者直接new new \Dash\TestClass1(); ~~~ 例子2: ~~~ "psr-4":{ //"root命名空间\\":"起始路径", "Dash\\tools\\":"./src/", }, ~~~ 此定义的类文件必须定义在composer.json同级目录下的src及其子文件夹下 >[warning]src/TestClass1.php 定义: ~~~ <?php namespace Dash\tools; class TestClass1{ } ~~~ 使用: ~~~ <?php use Dash\tools\TestClass1; new TestClass1(); //或者直接new new \Dash\tools\TestClass1(); ~~~ >[warning]src/church/TestClass1.php 定义: ~~~ <?php namespace Dash\tools\church; class TestClass1{ } ~~~ 使用: ~~~ <?php 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/" ] } ~~~