What Are the Differences Between PSR-0 and PSR-4?
They are very similar so it is not surprising that it's a bit confusing. The summary is that PSR-0 had some backwards compatibility features for PEAR-style classnames that PSR-4 dropped, as such it only supports namespaced code. On top of that PSR-4 does not force you to have the whole namespace as a directory structure, but only the part following the anchor point.
For example if you define that the Acme\Foo\
namespace is anchored in src/
, with PSR-0 it means it will look for Acme\Foo\Bar
in src/Acme/Foo/Bar.php
while in PSR-4 it will look for it in src/Bar.php
, allowing for shorter directory structures. On the other hand some prefer to have the full directory structure to clearly see what is in which namespace, so you can also say that Acme\Foo\
is in src/Acme/Foo
with PSR-4 which will gives you the equivalent of the PSR-0 behavior described above.
Long story short for new projects and for most intents and purposes, you can use PSR-4 and forget all about PSR-0.
Here are the major differences,
1. For example if you define that the Acme\Foo\
namespace is anchored in src/
,
- with PSR-0 it means it will look for
Acme\Foo\Bar
insrc/Acme/Foo/Bar.php
- while in PSR-4 it will look for
Acme\Foo\Bar
insrc/Bar.php(where Bar class is)
.
2. PSR-4 does not convert underscores to directory separators
3. You would prefer using PSR-4 with namespaces
4. PSR-0 will not work even if the class name is different from file name, like considering above example:
-
Acme\Foo\Bar
--->src/Acme/Foo/Bar.php
(for Bar class) will work -
Acme\Foo\Bar
--->src/Acme/Foo/Bar2.php
(for Bar class) will not work