it-swarm.com.ru

Каковы различия между PSR-0 и PSR-4?

Недавно я прочитал о пространствах имен и о том, как они полезны. В настоящее время я создаю проект в Laravel и ​​пытаюсь перейти от автозагрузки карты классов к пространству имен. Тем не менее, я не могу понять, какая на самом деле разница между PSR-0 и PSR-4.

Некоторые ресурсы, которые я прочитал, являются ...

Что я понимаю:

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

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

200
Varun Nath

Они очень похожи, поэтому неудивительно, что это немного сбивает с толку. В итоге 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.

256
Seldaek

Вот основные различия,

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 не преобразует подчеркивания в разделители каталогов

. Вы бы предпочли использовать PSR-4 с пространствами имен

4. PSR-0 не будет работать, даже если имя класса отличается от имени файла, как в рассмотренном выше примере:

  • Acme\Foo\Bar ---> src/Acme/Foo/Bar.php (для класса Bar) будет работать
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php (для класса Bar) не будет работать
40
Adil Abbasi

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

например.

конфигурации:

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

25
wbswjc

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

Классы должны храниться в папках в соответствии с их пространствами имен.

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

.
+-- src
    |
    +-- Book 
    |   +-- History
    |   |   +-- UnitedStates.php - namespace Book\History;
    +-- Vehicle
    |   +-- Air
    |   |   +-- Wings
    |   |   |   +-- Airplane.php - namespace Vehicle\Air\Wings;
    |   +-- Road
    |   |   +-- Car.php - namespace Vehicle\Road;
+-- tests
    +-- test.php
+-- vendor

Разница между PSR-0 и PSR-4

PSR-

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

composer.json

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

PSR-4

Глядя на файл vendor/composer/autoload_psr4.php, вы можете увидеть пространства имен и каталоги, в которые они отображаются.

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • Ищу Книга\История\UnitedStates in источник/История/UnitedStates.php
  • Ищем Автомобиль\Air\Wings\Самолет в источник/Air/Wings/Airplane.php

composer.json

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