Недавно я прочитал о пространствах имен и о том, как они полезны. В настоящее время я создаю проект в Laravel и пытаюсь перейти от автозагрузки карты классов к пространству имен. Тем не менее, я не могу понять, какая на самом деле разница между PSR-0 и PSR-4.
Некоторые ресурсы, которые я прочитал ...
Что я понимаю:
- PSR-4 не преобразует подчеркивания в разделители каталогов
- Некоторые конкретные правила композитора приводят к усложнению структуры каталогов, что, в свою очередь, делает многословным пространство имен PSR-0 и, таким образом, PSR-4 был создан
Примеры, объясняющие разницу, будут оценены.
Ответы:
Они очень похожи, поэтому неудивительно, что это немного сбивает с толку. В итоге 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.
источник
src/Bar.php
если вы говоритеAcme\Foo\ => src/
Вот основные различия,
1. Например, если вы определите, что
Acme\Foo\
пространство имен привязаноsrc/
,Acme\Foo\Bar
вsrc/Acme/Foo/Bar.php
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, «абсолютный путь».
например
конфигурации:
Автозагрузка PSR-0 :
Автозагрузка PSR-4 :
И есть еще некоторые различия в деталях между 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
файл, вы можете видеть пространства имен и каталоги, в которые они отображаются.composer.json
PSR-4
Глядя на
vendor/composer/autoload_psr4.php
файл, вы можете видеть пространства имен и каталоги, в которые они отображаются.composer.json
composer.json
источник
Даже когда я пытался, но Composer это беспорядок. К сожалению, это единственная альтернатива рынка.
Почему беспорядок?
Автозаполнение Composer работает нормально, если вы контролируете код. Однако, если вы импортируете другой проект, вы обнаружите множество стилей и способов создания папок. Например, некоторые проекты /company/src/class.php, в то время как другие - company / class.php, а другие - company / src / class / class.php
Я создал библиотеку, которая решает это:
https://github.com/EFTEC/AutoLoadOne (это бесплатно, MIT).
Он генерирует автоинклюзию путем сканирования всех классов папки, поэтому он работает в каждом случае (psr-0 psr-4, классы без пространства имен, файл с несколькими классами).
Редактировать: И снова, без голосования. ;-)
источник