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



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



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



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




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




  • PSR-4 не преобразует подчеркивания в разделители каталогов

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


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

973   5  

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.php

PSR-4 autoload:

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 файл вы можете увидеть пространства имен и каталоги, в которые они сопоставлены.

композитор.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

    Ничего не найдено.