Каковы различия между PSR-0 и PSR-4?

133

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

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

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

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

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

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

  • 2
    Прочитайте PSR0 и PSR4 . Они объясняют каждую деталь.
  • 3
    sitepoint.com/battle-autoloaders-psr-0-vs-psr-4
Показать ещё 2 комментария
Теги:
composer-php
psr-0
psr-4

3 ответа

197
Лучший ответ

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

  • 16
    Он выбирает src/Bar.php если вы говорите, Acme\Foo\ => src/
  • 1
    @ Правда, я отредактирую ответ, спасибо.
Показать ещё 3 комментария
25

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

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) не будет работать
  • 1
    Вы, безусловно, можете использовать PSR-4 без сценариев пространства имен, такого ограничения нет, и я его использую (не мой выбор)
  • 0
    В вашем 1. (первом пункте), откуда появился Бар для дела PSR-4?
Показать ещё 1 комментарий
14

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/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню