【发布时间】:2016-12-05 18:51:05
【问题描述】:
关于 Laravel,我有一个关于 Composer 自动加载的问题,即“psr-4”和“classmap”自动加载的区别。
我知道的 1 个区别是 PSR-4 不需要为每次更改或添加新文件重复 dumpautoload 而类映射需要 dumpautoload 对于包含类的现有文件的每次更改或在指定目录中添加新文件。
【问题讨论】:
标签: composer-php autoload psr-4
关于 Laravel,我有一个关于 Composer 自动加载的问题,即“psr-4”和“classmap”自动加载的区别。
我知道的 1 个区别是 PSR-4 不需要为每次更改或添加新文件重复 dumpautoload 而类映射需要 dumpautoload 对于包含类的现有文件的每次更改或在指定目录中添加新文件。
【问题讨论】:
标签: composer-php autoload psr-4
PSR-4 标准 要求您采用基于命名空间的严格文件系统结构。假设您在 src 目录中有一个带有 App 命名空间的应用程序,那么所有子命名空间都将镜像子目录,并且类名将与没有 .php 扩展名的文件名相同。
{
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
src/
Foo/
Bar.php <---- App\Foo\Bar class
Baz.php <---- App\Baz class
然后自动加载器“知道”在哪里寻找某个完全限定名称的类,因此不需要 dump-autoload 命令来嗅探文件的类。
然后使用composer dump-autoload --optimize-autoloader 标志或-o 解决性能问题,这将生成类映射,类似于类映射自动加载的方式。
另一方面,classmap autoloading几乎不需要你有任何特定的文件或目录结构,它会递归遍历指定目录和文件中的.php和.inc文件,并嗅探其中的课程。
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
然后将这些类添加到用于自动加载的列表(缓存在供应商/作曲家目录中的 PHP 文件中)。
然后必须通过运行composer dump-autoload 命令将任何新类添加到该列表中。
【讨论】:
files。例如,"autoload": { "files": [ "path/to/file1.php", "another/file.php", "etc.php" ] }.