В чем разница между PSR-0 и PSR-4?
Я недавно читал о пространствах имен и как они полезны.
Я создаю проект в Laravel и пытался перейти от автоматической загрузки карт классов к пространству имен.
Я не могу понять, что такое фактическая разница между PSR-0 и PSR-4.
Некоторые ресурсы, которые я читал из
насколько я понимаю:
- PSR-4 не преобразует подчеркивания в разделители каталогов
- определенные специфические правила композитора приводят к тому, что структура каталогов становится сложной, что, в свою очередь, делает пространство имен PSR-0 подробным и, таким образом, PSR-4 был создан
примеры, объясняющие разницу, будут оценены.
5 ответов:
они очень похожи, поэтому неудивительно, что это немного сбивает с толку. Резюме состоит в том, что PSR-0 имел некоторые функции обратной совместимости для имен классов PEAR-style, которые 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(для класса Bar) будет работатьAcme\Foo\Bar- - ->src/Acme/Foo/Bar2.php(для класса Bar) не будет работать
PSR-4-это что-то вроде "относительный путь", PSR-0, "абсолютный путь".
например
config:
'App\Controller' => 'dir/'PSR-0 autoload:
App\Controller\IndexController --> dir/App/Controller/IndexController.phpPSR-4 autoload:
App\Controller\IndexController --> dir/IndexController.phpи есть еще некоторые различия в деталях между PSR-0 и PSR-4, см. здесь:http://www.php-fig.org/psr/psr-4/
соглашение о пространстве имен / папках.
- классы должны храниться в папках в соответствии с их имен.
- в общем, вы создадите src/ каталог в корневой папке, сидя на том же уровне, что и vendor/, и добавите туда свои проекты. Ниже приведен пример структуры папок.
разница между psr-0 и psr-4
psr-0
Он является устаревшим. Глядя на
vendor/composer/autoload_namespaces.phpфайл вы можете увидеть пространства имен и каталоги, в которые они сопоставлены.композитор.json
"autoload": { "psr-0": { "Book\": "src/", "Vehicle\": "src/" } }
- ищем книги\History\UnitedStates in src / Book / История / Соединенные Штаты.php
- ищем транспортным средством\воздух\Крылья\самолет в src / Vehicle / Воздух / Крылья / Самолет.php
psr-4
смотрим
vendor/composer/autoload_psr4.phpфайл вы можете увидеть пространства имен и каталоги, в которые они сопоставлены.композитор.json
"autoload": { "psr-4": { "Book\": "src/", "Vehicle\": "src/" } }
- ищем книги\History\UnitedStates in src / История / Соединенные Штаты.php
- ищем транспортным средством\воздух\Крылья\самолет в src / Воздух / Крылья / Самолет.php
композитор.json
"autoload": { "psr-4": { "Book\": "src/Book/", "Vehicle\": "src/Vehicle/" } }
- ищем книги\History\UnitedStates src / Book / История / Соединенные Штаты.php
- ищем транспортным средством\Air \ Wings\самолет в src / Vehicle / Воздух / Крылья / Самолет.php
даже когда я пытался, но композитор-это беспорядок. К сожалению, это единственная альтернатива.рынка.
Почему такой беспорядок?.
Автозаполнение композитора отлично работает, если вы контролируете код. Однако, если вы импортируете другой проект, вы обнаружите, что у вас есть много стилей и способов создания папок. Например, некоторые проекты являются /company/src / class.php в то время как другие являются компанией/классом.php и другие-это company/src/class / class.phpЯ создал библиотеку, которая решает ее:
https://github.com/EFTEC/AutoLoadOne (это бесплатно, MIT).
Он генерирует автоинклюд путем сканирования всех классов папки, поэтому он работает в каждом случае (psr-0 psr-4, классы без пространства имен, файл с несколькими классами..
edit: и снова, понижен без каких-либо причин. ; -)

Comments