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

12 浏览
0 Comments

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

最近我学习了命名空间及其优势。我正在使用 Laravel 创建一个项目,并尝试从类映射自动加载转移到命名空间。然而,我似乎不能理解 PSR-0 和 PSR-4 之间的实际区别。

我阅读的一些资源是:

我所理解的是:

  • PSR-4 不会将下划线转换为目录分隔符
  • Composer 的某些特定规则使得目录结构变得复杂,从而使得 PSR-0 命名空间显得冗长,因此创建了 PSR-4。

希望有例子来解释两者的区别。

admin 更改状态以发布 2023年5月23日
0
0 Comments

以下是主要的区别:

1. 例如,如果您定义Acme\Foo\命名空间以src/为锚点,

  • 使用PSR-0,意味着它将在src/Acme/Foo/Bar.php中查找Acme\Foo\Bar
  • 而使用PSR-4,它将在src/Bar.php(其中Bar类位于其中)中查找Acme\Foo\Bar

2. PSR-4不会将下划线转换为目录分隔符

3. 您应该优先使用带有命名空间的PSR-4

4. 即使类名与文件名不同,如上例所示,PSR-0也将无法工作:

  • Acme\Foo\Bar ---> src/Acme/Foo/Bar.php(对于Bar类)将工作
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php(对于Bar类)将不起作用
0
0 Comments

它们非常相似,所以混淆一点也不奇怪。总结一下,PSR-0具有与PEAR风格类名向后兼容的功能,而PSR-4删除了这些功能,因此它仅支持命名空间代码。此外,PSR-4不强制您将整个命名空间作为目录结构,而只需要跟随锚点的部分即可。例如,如果您定义Acme\\Foo\\命名空间是以src/为锚点,请使用PSR-0,则表示它将在src/Acme/Foo/Bar.php中查找Acme\\Foo\\Bar,而使用PSR-4则在src/Bar.php中查找,从而允许更短的目录结构。另一方面,一些人更喜欢拥有完整的目录结构,以清楚地看到哪个命名空间中有什么,因此您还可以说Acme\\Foo\\src/Acme/Foo中使用PSR-4,这将为您提供上述PSR-0行为的等效功能。长话短说,对于新项目和大多数意图和目的,您可以使用PSR-4并忘记所有关于PSR-0的内容。

0