В чем разница между PSR-0 и PSR-4?

Я недавно читал об пространствах имен и о том, как они полезны.

Я создаю проект в Laravel и пытаюсь перейти от автозагрузки классов к пространству имен.

Я не могу понять, что представляет собой реальная разница между PSR-0 и PSR-4. Некоторые ресурсы, которые я читал, это

Что я понимаю:

  • PSR-4 не преобразует символы подчеркивания в разделители каталогов
  • Некоторые специфические правила композитора вызывают сложность структуры каталогов, которая, в свою очередь, расширяет пространство имен PSR-0 и, следовательно, создается PSR-4

Примеры, объясняющие разницу, будут оценены.

Ответ 1

Они очень похожи, поэтому неудивительно, что это немного запутывает. Резюме состоит в том, что 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.

Ответ 2

Вот основные отличия,

1. Например, если вы определяете, что пространство имен Acme\Foo\ закреплено в src/,

  • с PSR-0 это означает, что он будет искать Acme\Foo\Bar в src/Acme/Foo/Bar.php
  • пока в PSR-4 он будет искать 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) не будет работать

Ответ 3

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/