PSR-4 和类映射自动加载之间的区别?

Difference between PSR-4 and classmap autoloading?

关于 Laravel,我有一个关于 Composer 自动加载的问题,即 "psr-4" 和 "classmap" 自动加载之间的区别。

1 我知道的区别是 PSR-4 不需要对每次更改或添加新文件重复 dumpautoload,而类图需要 dumpautoload 对包含 [=19= 的现有文件中的每个更改] 或在指定目录中添加新文件。

PSR-4 标准 要求您使用基于名称空间的严格文件系统结构。假设您在具有 App 命名空间的 src 目录中有一个应用程序,那么所有子命名空间将镜像子目录并且 class 名称将与没有 .php 扩展名的文件名相同.

{
    "autoload": {
        "psr-4": { "App\": "src/" }
    }
}

src/
    Foo/
        Bar.php <---- App\Foo\Bar class
    Baz.php <---- App\Baz class

自动加载器然后 "knows" 在哪里寻找某个完全限定名称的 class,因此不需要 dump-autoload 命令嗅探文件 classes .

然后使用 composer dump-autoload --optimize-autoloader 标志或 -o 解决性能问题,这将以类似于 class 地图自动加载的方式生成 class 地图。


另一方面,class地图自动加载几乎不需要你有任何特定的文件或目录结构,它会递归地通过.php.inc 指定目录和文件中的文件,并在其中嗅探 classes。

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

然后将这些 class 添加到用于自动加载的列表(缓存在 vendor/composer 目录中的 PHP 文件中)。

然后必须通过 运行 composer dump-autoload 命令将任何新的 class 添加到该列表。