Ostatnio czytałem o przestrzeniach nazw i ich zaletach. Obecnie tworzę projekt w Laravel i próbuję przejść z automatycznego ładowania map klas do przestrzeni nazw. Wydaje mi się jednak, że nie rozumiem, jaka jest rzeczywista różnica między PSR-0 a PSR-4.
Niektóre zasoby, które przeczytałem to ...
Co rozumiem:
- PSR-4 nie konwertuje znaków podkreślenia na separatory katalogów
- Pewne szczególne reguły kompozytora powodują, że struktura katalogów staje się złożona, co z kolei powoduje, że przestrzeń nazw PSR-0 jest pełna, a zatem PSR-4 został utworzony
Docenione zostaną przykłady wyjaśniające różnicę.
Odpowiedzi:
Są bardzo podobne, więc nic dziwnego, że jest to trochę mylące. Podsumowując, PSR-0 miał pewne funkcje kompatybilności wstecznej dla nazw klas w stylu PEAR, które PSR-4 upuścił, dlatego obsługuje tylko kod z przestrzenią nazw. Na dodatek PSR-4 nie zmusza cię do posiadania całej przestrzeni nazw jako struktury katalogów, a jedynie część po punkcie zakotwiczenia.
Na przykład, jeśli zdefiniujesz, że
Acme\Foo\
przestrzeń nazw jest zakotwiczona wsrc/
, z PSR-0 to oznacza, że będzie szukaćAcme\Foo\Bar
wsrc/Acme/Foo/Bar.php
natomiast w PSR-4 będzie szukać wsrc/Bar.php
, pozwalając na krótszych struktur katalogów. Z drugiej strony niektórzy wolą mieć pełną strukturę katalogów, aby wyraźnie zobaczyć, w jakiej przestrzeni nazw, więc możesz też powiedzieć, żeAcme\Foo\
jest wsrc/Acme/Foo
PSR-4, który da ci równoważne zachowanie PSR-0 opisane powyżej.Krótko mówiąc o nowych projektach oraz większości zamierzeń i celów, możesz użyć PSR-4 i zapomnieć o PSR-0.
źródło
src/Bar.php
jeśli powieszAcme\Foo\ => src/
Oto główne różnice,
1. Na przykład, jeśli zdefiniujesz, że
Acme\Foo\
przestrzeń nazw jest zakotwiczonasrc/
,Acme\Foo\Bar
wsrc/Acme/Foo/Bar.php
Acme\Foo\Bar
wsrc/Bar.php(where Bar class is)
.2. PSR-4 nie konwertuje podkreśleń na separatory katalogów
3. Wolisz używać PSR-4 z przestrzeniami nazw
4. PSR-0 nie będzie działać, nawet jeśli nazwa klasy jest inna niż nazwa pliku, podobnie jak w powyższym przykładzie:
Acme\Foo\Bar
--->src/Acme/Foo/Bar.php
(dla klasy Bar) będzie działaćAcme\Foo\Bar
--->src/Acme/Foo/Bar2.php
(dla klasy Bar) nie będzie działaćźródło
PSR-4 to coś w rodzaju „ścieżki względnej”, PSR-0, „ścieżki absolutnej”.
na przykład
config:
Automatyczne ładowanie PSR-0 :
Automatyczne ładowanie PSR-4 :
I jest jeszcze więcej różnic w szczegółach między PSR-0 i PSR-4, patrz tutaj: http://www.php-fig.org/psr/psr-4/
źródło
Konwencja przestrzeni nazw / folderów.
Klasy powinny być przechowywane w folderach zgodnie z ich przestrzeniami nazw.
Ogólnie rzecz biorąc, utworzysz katalog src / w folderze głównym na tym samym poziomie co dostawca / i dodasz tam swoje projekty. Poniżej znajduje się przykład struktury folderów:
Różnica między psr-0 i psr-4
psr-0
To jest przestarzałe. Patrząc na
vendor/composer/autoload_namespaces.php
plik, możesz zobaczyć przestrzenie nazw i katalogi, na które są mapowane.composer.json
psr-4
Patrząc na
vendor/composer/autoload_psr4.php
plik, możesz zobaczyć przestrzenie nazw i katalogi, na które są mapowane.composer.json
composer.json
źródło
Nawet kiedy próbowałem, ale Kompozytor to bałagan. Niestety, jest to jedyna alternatywa na rynku.
Dlaczego bałagan?
Autouzupełnianie kompozytora działa dobrze, jeśli masz kontrolę nad kodem. Jeśli jednak importujesz inny projekt, znajdziesz wiele stylów i sposobów tworzenia folderów. Na przykład niektóre projekty to /company/src/class.php, podczas gdy inne to company / class.php, a inne to company / src / class / class.php
Stworzyłem bibliotekę, która to rozwiązuje:
https://github.com/EFTEC/AutoLoadOne (za darmo, MIT).
Generuje autowyłączanie poprzez skanowanie wszystkich klas folderu, więc działa w każdym przypadku (psr-0 psr-4, klasy bez przestrzeni nazw, plik z wieloma klasami ..
edytuj: I ponownie, przegłosowano bez żadnego powodu. ;-)
źródło