最近我读到了命名空间以及它们如何有益。我目前正在 Laravel 中创建一个项目,并尝试从类映射自动加载转移到命名空间。但是,我似乎无法掌握 PSR-0 和 PSR-4 之间的实际区别。
我读过的一些资源是……
我的理解:
- PSR-4 不会将下划线转换为目录分隔符
- composer 的某些特定规则导致目录结构变得复杂,这反过来又使 PSR-0 命名空间变得冗长,因此创建了 PSR-4
解释差异的示例将不胜感激。
以下是主要区别,
1.例如,如果您定义Acme\Foo\
命名空间锚定在src/
,
- 使用 PSR-0 意味着它会寻找
Acme\Foo\Bar
在src/Acme/Foo/Bar.php
- 而在 PSR-4 中它会寻找
Acme\Foo\Bar
在src/Bar.php(where Bar class is)
.
2.PSR-4 不会将下划线转换为目录分隔符
3.您更喜欢将 PSR-4 与命名空间一起使用
4.即使类名与文件名不同,PSR-0 也不起作用,例如考虑上面的示例:
Acme\Foo\Bar
—>src/Acme/Foo/Bar.php
(对于酒吧类)将工作Acme\Foo\Bar
—>src/Acme/Foo/Bar2.php
(对于酒吧类)将不起作用
你当然可以使用 PSR-4 而没有命名空间脚本,没有这样的限制,我确实使用它(不是我的选择)
在您的 1.(第一点)中,对于 PSR-4 案例,Bar 是从哪里来的?
PSR-4 类似于“相对路径”、PSR-0、“绝对路径”。
例如
配置:
'App\Controller' => 'dir/'
PSR-0自动加载:
App\Controller\IndexController --> dir/App/Controller/IndexController.php
PSR-4自动加载:
App\Controller\IndexController --> dir/IndexController.php
PSR-0 和 PSR-4 在细节上还有一些差异,请参见此处:http://www.php-fig.org/psr/psr-4/
命名空间/文件夹约定。
类应根据其名称空间存储在文件夹中。
通常,您将在根文件夹中创建一个 src/ 目录,与 vendor/ 位于同一级别,并在那里添加您的项目。以下是文件夹结构的示例:
.
+-- src
|
+-- Book
| +-- History
| | +-- UnitedStates.php - namespace Book\History;
+-- Vehicle
| +-- Air
| | +-- Wings
| | | +-- Airplane.php - namespace Vehicle\Air\Wings;
| +-- Road
| | +-- Car.php - namespace Vehicle\Road;
+-- tests
+-- test.php
+-- vendor
psr-0 和 psr-4 的区别
psr-0
它已被弃用。看着vendor/composer/autoload_namespaces.php
文件,您可以看到命名空间和它们映射到的目录。
作曲家.json
"autoload": {
"psr-0": {
"Book\\": "src/",
"Vehicle\\": "src/"
}
}
- 寻找书\历史\美国在源/书/历史/UnitedStates.php
- 寻找车辆\Air\Wings\Airplane in来源/车辆/Air/Wings/Airplane.php
psr-4
看着vendor/composer/autoload_psr4.php
文件,您可以看到命名空间和它们映射到的目录。
作曲家.json
"autoload": {
"psr-4": {
"Book\\": "src/",
"Vehicle\\": "src/"
}
}
- 寻找书\历史\美国在源代码/历史/UnitedStates.php
- 寻找车辆\Air\Wings\Airplane in源代码/Air/Wings/Airplane.php
作曲家.json
"autoload": {
"psr-4": {
"Book\\": "src/Book/",
"Vehicle\\": "src/Vehicle/"
}
}
- 寻找书\历史\美国源/书/历史/UnitedStates.php
- 寻找车辆\Air\Wings\Airplane in来源/车辆/Air/Wings/Airplane.php
挣扎了一段时间,直到这篇文章。非常感谢您提供简洁的示例!
读PSR0和PSR4.他们解释了每一个细节。
sitepoint.com/battle-autoloaders-psr-0-vs-psr-4
☝️ 有人应该输入这个要点作为答案…… 🙂
IMO,PSR 中的大部分内容是关于他们喜欢什么,而不是什么是正确的……