问答中心分类: LARAVELPSR-0 和 PSR-4 有什么区别?
0
匿名用户 提问 6小时 前

最近我读到了命名空间以及它们如何有益。我目前正在 Laravel 中创建一个项目,并尝试从类映射自动加载转移到命名空间。但是,我似乎无法掌握 PSR-0 和 PSR-4 之间的实际区别。
我读过的一些资源是……

我的理解:

  • PSR-4 不会将下划线转换为目录分隔符
  • composer 的某些特定规则导致目录结构变得复杂,这反过来又使 PSR-0 命名空间变得冗长,因此创建了 PSR-4

解释差异的示例将不胜感激。

Sverri M. Olsen 回复 6小时 前

PSR0PSR4.他们解释了每一个细节。

Sverri M. Olsen 回复 6小时 前

☝️ 有人应该输入这个要点作为答案…… 🙂

Sverri M. Olsen 回复 6小时 前

IMO,PSR 中的大部分内容是关于他们喜欢什么,而不是什么是正确的……

3 Answers
0
Adil Abbasi 回答 6小时 前

以下是主要区别,
1.例如,如果您定义Acme\Foo\命名空间锚定在src/,

  • 使用 PSR-0 意味着它会寻找Acme\Foo\Barsrc/Acme/Foo/Bar.php
  • 而在 PSR-4 中它会寻找Acme\Foo\Barsrc/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(对于酒吧类)将不起作用
Galvani 回复 6小时 前

你当然可以使用 PSR-4 而没有命名空间脚本,没有这样的限制,我确实使用它(不是我的选择)

cjmling 回复 6小时 前

在您的 1.(第一点)中,对于 PSR-4 案例,Bar 是从哪里来的?

0
wbsnail 回答 6小时 前

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/

0
Udhav Sarvaiya 回答 6小时 前

命名空间/文件夹约定。
类应根据其名称空间存储在文件夹中。
通常,您将在根文件夹中创建一个 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
Ricky Goldman 回复 6小时 前

挣扎了一段时间,直到这篇文章。非常感谢您提供简洁的示例!