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 和类图自动加载的区别?的主要内容,如果未能解决你的问题,请参考以下文章