Я недавно прочитал об пространствах имен и о том, как они полезны.
Я создаю проект в Laravel и пытаюсь перейти от автозагрузки классов к пространству имен.
Я не могу понять, какова фактическая разница между PSR-0 и PSR-4. Некоторые ресурсы, которые я прочитал, являются
Я понимаю:
Примеры, объясняющие разницу, будут оценены.
Они очень похожи, поэтому неудивительно, что это немного запутанно. Резюме состоит в том, что PSR-0 имеет некоторые функции обратной совместимости для названий классов в стиле PEAR, которые PSR-4 отбрасывал, поэтому он поддерживает только код с расширением имен. Кроме того PSR-4 не заставит вас есть все пространство имен, структуру каталогов, но только часть следующей точки привязки.
Например, если вы определите, что пространство имен Acme\Foo\
закреплено в src/
, с PSR-0 это означает, что он будет искать Acme\Foo\Bar
в src/Acme/Foo/Bar.php
тогда как в PSR-4 он будет ищите его в src/Bar.php
, что позволяет использовать более короткие структуры каталогов. С другой стороны, некоторые предпочитают иметь полную структуру каталогов, чтобы четко видеть, что такое пространство имен, поэтому вы также можете сказать, что Acme\Foo\
находится в src/Acme/Foo
с PSR-4, что даст вам эквивалент Поведение PSR-0, описанное выше.
Короче говоря, для новых проектов и для большинства целей и целей вы можете использовать PSR-4 и забыть о PSR-0.
Вот основные отличия,
1. Например, если вы определяете, что пространство имен Acme\Foo\
закреплено в src/
,
Acme\Foo\Bar
в src/Acme/Foo/Bar.php
Acme\Foo\Bar
в src/Bar.php(where Bar class is)
. 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 – это что-то вроде «относительного пути», PSR-0, «абсолютный путь».
например
конфигурации:
'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/