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/