Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][inne]Symfony standard + PSR a namespace i use dla globalnych klas
Forum PHP.pl > Forum > Przedszkole
Geniesis
Witam,
Mam pytanie dosyć teoretyczne, nie wiem czy to brak znajomości angielskiego czy też faktycznie nie ma o tym słowa, stąd wolę dopytać.

W php mamy domyśle klasy np. gatunku /Exception, /DateTime itd.

Według PSR i standardów symfony w kodzie te klasy także powinny być wrzucone w use czy też nie?

v1
  1. namespace x;
  2.  
  3. use Exception;
  4.  
  5. class y
  6. {
  7. function z()
  8. {
  9. new Exception();
  10. }
  11. }

czy też v2
  1. namespace x;
  2.  
  3. class y
  4. {
  5. function z()
  6. {
  7. new \Exception();
  8. }
  9. }


Jeżeli ja dobrze zrozumiałem to powinniśmy trzymać się v1, jednakże wolę dopytać.

W PSR-1 mamy:
Cytat
Namespaces and classes MUST follow an “autoloading” PSR: [PSR-0, PSR-4].


W Symfony standards mamy:
Cytat
Use namespaces for all classes;


Tylko nie mam pewności czy to faktycznie dotyczy użycia use dla klas z global namespace.
SmokAnalog
Zacznijmy od tego, że te klasy w globalnej przestrzeni to nie /Exception i /DateTime, tylko \Exception i \DateTime. Znak slash nie występuje w temacie przestrzeni nazw. Tylko i wyłącznie backslash. Niby niuans, a jednak bardzo ważny.

A odpowiadając na Twoje pytanie, zarówno wersja pierwsza, jak i druga są prawidłowe. Standardy PSR nie wskazują czy używać use czy nie. One tylko mówią jaka powinna być przestrzeń nazw względem położenia w systemie plików.

Cytat
Use namespaces for all classes;


Czyli: Używaj przestrzeni nazw dla wszystkich klas. Nie ma to nic do rzeczy z użyciem lub brakiem użycia use, chociaż rozumiem Twoje zwątpienie. Ta zasada mówi tylko tyle, że każda z Twoich własnych klas powinna leżeć w jakiejś przestrzeni nazw, czyli nie powinieneś deklarować klasy w ten sposób:

  1. class Cat {
  2. // ...
  3. }


Ale już ta klasa jest w porządku:



  1. namespace Animals;
  2.  
  3. class Cat {
  4. // ...
  5. }


Oczywiście najlepiej, gdy sama przestrzeń będzie też w zgodzie ze standardami Symfony, jednak powyższy Cat spełnia już te podstawowe wymagania. Po prostu nie zaśmiecasz globalnej przestrzeni nazw.

Podsumowując: używanie przestrzeni nazw to przyłączenie danej klasy do przestrzeni nazw, a nie uwzględnienie innych klas w sekcji use. To ostatnie służy tylko temu, by łatwiej się odnosić do tych innych klas. Żaden standard nie stoi na przeszkodzie, byś odwołania do wszystkich innych klas podawał z ich pełną przestrzenią nazw. Byłoby to jednak uciążliwe.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.