关于Laravel,我有一个关于Composer自动加载的问题,即“psr-4”和“classmap”自动加载之间的区别。
我知道的一个区别是PSR-4对于每次更改或添加新文件都不需要重复dumpautoload
,而对于包含类或添加新文件的现有文件中的每次更改,classmap都需要dumpautoload
在指定的目录中。
答案 0 :(得分:31)
PSR-4标准需要基于命名空间的严格文件系统结构。假设您在src
目录中有App
命名空间的应用程序,那么所有子命名空间都将镜像子目录,类名将与没有.php
扩展名的文件名相同。
{
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
src/
Foo/
Bar.php <---- App\Foo\Bar class
Baz.php <---- App\Baz class
然后自动加载器&#34;知道&#34;在哪里查找某个完全限定名称的类,因此不需要dump-autoload命令来嗅探类的文件。
然后使用composer dump-autoload --optimize-autoloader
标记或-o
解决性能问题,这将生成类映射,类似于类映射自动加载。
另一方面, classmap autoloading 不要求您拥有几乎任何特定的文件或目录结构,它将以递归方式遍历指定的.php
和.inc
个文件目录和文件以及它们中的类的嗅探。
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
然后将这些类添加到用于自动加载的列表(缓存在vendor / composer目录中的PHP文件中)。
然后必须通过运行composer dump-autoload
命令将任何新类添加到该列表中。