PSR-0 and PSR-4 Autoloading
I had read what’s PSR-0 and PSR-4 multiple times and every time after reading it, I had said to myself “I know this now(finally)”. But eventually I didn’t.
Realized this while I was going through Laravel documentation(once again).
I read the docs on php-fig one more time and peeped inside the vendor directory, read a few composer.json files to understand it.
So this time writing it here so that I remember what exactly they are.
PSR-0
PSR-0 path, says where to start. From there, it matches the complete Namespace string.
Example :
"autoload": { "psr-0": {"JakubOnderka\\PhpConsoleColor": "src/"} },
This will tell autoloader to start at __DIRNAME__/src
( __DIRNAME__ where composer.json is located), from there it will match each of the Namespace part to a directory.
So if you use JakubOnderka\PhpConsoleColor\XYZ
in your code then following file will be loaded __DIRNAME__/src/JakubOnderka\PhpConsoleColor\XYZ.php
PSR-4
PSR-4 says – Tell me the Namespace prefix
and its location, every part after this Namespace prefix, it will map to directories, within the directory.
Example:
"psr-4": { "Illuminate\\": "src/Illuminate/" }
It says Illuminate
prefix starts at __DIRNAME__/src/Illuminate
( __DIRNAME__ where composer.json is located), from here match each sub-namespace after the Namespace prefix to a directory. So something like Illuminate\Http\Request
will map to __DIRNAME__/src/Illuminate/Http/Request.php
There is another difference that in PSR-0 each _ in class name referred to a directory(Zend Framework 1 made heavy use of it).
I hope that I will remember it now.