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

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

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

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

насколько я понимаю:

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

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

5 ответов


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

  • С 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 (для класса бара) будет работать
  • Acme\Foo\Bar - - ->src/Acme/Foo/Bar2.php (для класса Bar) не будет работать

PSR-4-это что-то вроде "относительного пути", PSR-0, "абсолютного пути".

например

config:

'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/


Соглашение пространства имен / папок.

  • классы должны храниться в папках в соответствии с их имен.
  • в общем, вы создадите каталог src/ в своей корневой папке, сидя на том же уровне, что и vendor/, и добавите туда свои проекты. Ниже приведен пример структуры папок.

enter image description here

разница между psr-0 и psr-4

psr-0

это устарело. Глядя на vendor/composer/autoload_namespaces.php file вы можете увидеть пространства имен и каталоги, к которым они сопоставлены.

композитор.в JSON

 "autoload": {
        "psr-0": {
            "Book\": "src/",
            "Vehicle\": "src/"
        }
    } 
  • ищем книги\история\UnitedStates в src / Book / История / UnitedStates.в PHP
  • ищем транспортным средством \ Air\Wings\самолет в в src/автомобиль / Воздух / Крылья / Самолет.в PHP

psr-4

смотрим vendor/composer/autoload_psr4.php file вы можете увидеть пространства имен и каталоги, к которым они сопоставлены.

композитор.в JSON

"autoload": {
    "psr-4": {
        "Book\": "src/",
        "Vehicle\": "src/"
    }
}   
  • ищем книги\история\UnitedStates в src / История / UnitedStates.в PHP
  • ищем транспортным средством \ Air\Wings\самолет в src / Воздух / Крылья / Самолет.в PHP

композитор.в JSON

"autoload": {
    "psr-4": {
        "Book\": "src/Book/",
        "Vehicle\": "src/Vehicle/"
    }
}    
  • ищем книги\История\UnitedStates src / Book / История / UnitedStates.в PHP
  • ищем транспортным средством\Air\Wings\самолет в в src/автомобиль / Воздух / Крылья / Самолет.в PHP

даже когда я пытался, но композитор беспорядок. К сожалению, это единственная альтернатива.рынка.
Почему беспорядок?.
Автозаполнение композитора отлично работает, если вы контролируете код. Однако, если вы импортируете другой проект, у вас будет много стилей и способов создания папок. Например, некоторые проекты /company/src/class.php в то время как другие являются компанией/классом.php и другие являются company/src/class/class.в PHP

Я создал библиотеку, которая решает его:

https://github.com/EFTEC/AutoLoadOne (это бесплатно, MIT).

Он генерирует автоинклюд, сканируя все классы папки, поэтому он работает в каждом случае (psr-0 psr-4, классы без пространства имен, файл с несколькими классами..

edit: и снова, downvoted без каких-либо причин. ;-)