PSR-4 和类图自动加载的区别?

Posted

技术标签:

【中文标题】PSR-4 和类图自动加载的区别?【英文标题】:Difference between PSR-4 and classmap autoloading? 【发布时间】:2016-12-05 18:51:05 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

没有类的普通 php 文件怎么样?例如只是一个带有一堆全局函数的php文件,如何添加? @Toskan 为此,请使用files。例如,"autoload": "files": [ "path/to/file1.php", "another/file.php", "etc.php" ] . 可以一起加载类和文件,只需使用自动加载,因为我已经尝试过但失败了。两者分开很好,但在一起没有骰子。 当然。只需将 classmap/psr/files 并排使用。但是,自动加载/转储将在重复的类 FQN 上失败。如果您有具体问题,也许可以创建一个单独的问题。

以上是关于PSR-4 和类图自动加载的区别?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Composer 自动加载 PSR-4

Composer psr-4 自动加载问题

PSR-4 自动加载器致命错误:找不到类

如何为我的项目创建 PSR-4 自动加载器?

composer+psr-4实现自动加载

Laravel psr-4 不自动加载