PSR-0和PSR-4有什么不同?

我最近阅读了关于命名空间和它们是如何有益的。

我正在Laravel创build一个项目,并试图从类映射自动加载到命名空间。

我似乎无法理解PSR-0和PSR-4之间的实际区别。 我读过的一些资源是

  • 自动加载器的战斗
  • Laracasts PSR-4自动加载
  • PSR-0
  • PSR-4

我明白:

  • PSR-4不会将下划线转换为目录分隔符
  • composer php的某些具体规则导致目录结构变得复杂,从而使得PSR-0命名空间冗长,从而创build了PSR-4

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

他们是非常相似的,所以这是有点混淆并不奇怪。 总结一下,PSR-0具有PSR-4丢弃的PEAR风格类名的一些向后兼容性特性,因此它只支持命名空间代码。 除此之外,PSR-4不会强制将整个名称空间作为一个目录结构,而只是将其作为锚点。

例如,如果你将Acme\Foo\命名空间定义在src/ ,PSR-0就意味着它将在src/Acme/Foo/Bar.php中查找Acme\Foo\Bar ,而在PSR-4中它将会在src/Bar.php查找它,允许更短的目录结构。 另一方面,有些人更喜欢使用完整的目录结构来清楚地看到哪些命名空间,所以你也可以说Acme\Foo\是在PSR-4的src/Acme/Foo ,它会给你相当于上面描述的PSR-0行为。

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

以下是主要差异,

1.例如,如果您定义Acme\Foo\名称空间是锚定在src/

  • 与PSR-0它意味着它会在src/Acme/Foo/Bar.php寻找Acme\Foo\Bar
  • 而在PSR-4中,它会在src/Bar.php查找它。

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类)将不起作用

PSR-4就像“相对path”,PSR-0,“绝对path”。

例如

configuration:

 '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/