PSR-0和PSR-4有什么区别?

2022-08-30 06:11:16

最近,我阅读了有关命名空间及其益处的信息。我目前正在Laravel中创建一个项目,并尝试从类映射自动加载到命名空间。但是,我似乎无法理解PSR-0和PSR-4之间的实际区别是什么。

我读过的一些资源是...

我明白:

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

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


答案 1

它们非常相似,因此有点令人困惑也就不足为奇了。总结一下,PSR-0 对 PSR-4 丢弃的 PEAR 样式类名具有一些向后兼容性功能,因此它仅支持命名空间代码。最重要的是,PSR-4 不会强制您将整个命名空间作为目录结构,而只是将锚点后面的部分。

例如,如果您使用 PSR-0 定义命名空间锚定在 中,则表示它将在 中查找,而在 PSR-4 中,它将在 中查找它,从而允许较短的目录结构。另一方面,有些人更喜欢使用完整的目录结构来清楚地看到哪个命名空间中的内容,因此您也可以说PSR-4具有PSR-4,这将为您提供与上述PSR-0行为等效的特性。Acme\Foo\src/Acme\Foo\Barsrc/Acme/Foo/Bar.phpsrc/Bar.phpAcme\Foo\src/Acme/Foo

长话短说,对于新项目以及大多数意图和目的,您可以使用PSR-4并忘记有关PSR-0的所有信息。


答案 2

以下是主要区别,

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(对于酒吧类)将不起作用

推荐