Які відмінності між PSR-0 та PSR-4?


225

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

Деякі ресурси, які я читав, це ...

Що я розумію:

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

Приклади, що пояснюють різницю, були б вдячні.


3
Прочитайте PSR0 та PSR4 . Вони пояснюють кожну деталь.
Сверрі М. Олсен


4
☝️ Хтось повинен набрати суть цього як відповідь ... :)
дема

1
IMO, більшість частин в PSR - це те, що їм подобається, а не те, що ПРАВО ...
Yousha Aleayoub

Відповіді:


283

Вони дуже схожі, тому не дивно, що це трохи заплутано. Підсумок полягає в тому, що 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/FooPSR-4, що надасть вам еквівалент поведінки PSR-0, описаного вище.

Довге оповідання про нові проекти та для більшості намірів та цілей, ви можете використовувати PSR-4 і забути про PSR-0.


17
Він вибирає , src/Bar.phpякщо ви говоритеAcme\Foo\ => src/
Seldaek

Дуже дякую за пояснення!
尤川豪

4
PSR-4 повільніше, ніж PSR-0, чи не так?
Нгуен Лін

2
@ NguyenLinh Я так не думаю. Це робиться те саме, але, можливо, із меншим рівнем каталогів, так що насправді це може бути трохи швидше. Виміряйте це. Ви можете створити пакет, в якому можна переключатися між PSR-0 і PSR-4 - я не думаю, що ви не побачите різниці.
Свен

44

Ось основні відмінності,

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) не буде працювати

1
Ви, звичайно, можете використовувати PSR-4 разом із сценаріями простору імен, такого обмеження немає, і я його використовую (не мій вибір)
Galvani

У вашому 1. (перший пункт) звідки взявся Бар для випадку PSR-4?
цимлінг

31

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/


10

Простір імен / умовні папки.

Класи слід зберігати у папках відповідно до їх просторів імен.

Загалом, ви створите src / каталог у вашій кореневій папці, сидячи на тому ж рівні, що і постачальник /, і додасте туди свої проекти. Нижче наведено приклад структури папки:

.
+-- 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-0

Вона застаріла. Переглядаючи vendor/composer/autoload_namespaces.phpфайл, ви можете побачити простори імен та каталоги, в які вони відображені.

composer.json

"autoload": {
        "psr-0": {
            "Book\\": "src/",
            "Vehicle\\": "src/"
        }
} 
  • Мета книги \ Історія \ UnitedStates в ЦСМ / Book /History/UnitedStates.php
  • Шукаю транспортний засіб \ Повітря \ Крила \ Літак в src / Vehicle / Air/Wings / Airplane.php

psr-4

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

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • Шукаєте Книгу \ Історію \ UnitedStates в src /History/UnitedStates.php
  • Шукаєте транспортний засіб \ Повітря \ Крила \ Літак в src /Air/Wings/Airplane.php

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • Мета книги \ History \ UnitedStates SRC / Book /History/UnitedStates.php
  • Шукаю транспортний засіб \ Повітря \ Крила \ Літак в src / Vehicle / Air/Wings / Airplane.php

-4

Навіть коли я намагався, але композитор - це безлад. На жаль, це єдина альтернатива ринку.
Чому безлад ?.
Автозаповнення композитора працює добре, якщо ви контролюєте код. Однак якщо ви імпортуєте інший проект, ви опинитеся з великою кількістю стилів та способів створення папок. Наприклад, деякі проекти є /company/src/class.php, а інші - company / class.php, а інші - company / src / class / class.php

Я створив бібліотеку, яка її вирішує:

https://github.com/EFTEC/AutoLoadOne (це безкоштовно, MIT).

Він створює автоматичне включення, скануючи всі класи папки, тому він працює у кожному випадку (psr-0 psr-4, класи без простору імен, файл з декількома класами ..

редагувати: І знову, знятий без будь-яких причин. ;-)


Прочитайте про параметр classmap в composer.json. getcomposer.org/doc/04-schema.md#classmap - може бути причиною відмови у відповіді.
Патрік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.