PSR-4和classmap自动加载之间的区别?

时间:2016-07-31 16:37:49

标签: composer-php autoload psr-4

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

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

1 个答案:

答案 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命令将任何新类添加到该列表中。