В чем разница между 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/, и добавите туда свои проекты. Ниже приведен пример структуры папок.
разница между 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 без каких-либо причин. ;-)