Plusy i minusy przestrzeni nazw vs. obejmują / wymagają w PHP?

20

Niedawno zacząłem używać przestrzeni nazw w PHP. Kiedy pierwszy raz je zobaczyłem, pomyślałem, że ich składnia jest brzydka i nigdy ich nie użyję. Jednak utworzyłem autoloader (spl_autoload_register), który sprawia, że ​​nie muszę już nigdy pisać instrukcji włącz / wymagaj.

Lubię przestrzenie nazw, ale czy jest jakaś obiektywna korzyść w stosunku do instrukcji włączania / żądania, czy też są one dokładnie tą samą metodą do osiągnięcia tego samego celu?

NobleUplift
źródło
1
Przestrzenie nazw zapobiegają kolizjom z bibliotekami stron trzecich.
Reactgular,
1
W tej chwili podstawową korzyścią dotyczącą przestrzeni nazw jest automatyczne ładowanie. Na przykład używam in-line new \Vendor\Namespace\Class()bez instrukcji request wcześniej w metodzie lub klasie.
NobleUplift,
3
Wiele bibliotek PHP korzysta z automatycznego ładowania bez przestrzeni nazw. PHP powinno wprowadzić obowiązkowe przestrzenie nazw.
Reactgular,
Żadnego argumentu ode mnie. Chciałbym zobaczyć wszystkie te zmiany wymienione tutaj .
NobleUplift,

Odpowiedzi:

21

Przestrzenie nazw służą nie tylko do automatycznego ładowania klas. Zapobiegają także konfliktom nazw. W rzeczywistości jest to ich główny cel.

Załóżmy, że masz projekt, który potrzebuje klasy o nazwie Userdo przechowywania informacji o użytkownikach aplikacji, ale wtyczka używa także (innej) klasy o nazwie Userdo przechowywania informacji. Przestrzenie nazw pozwalają tworzyć klasę w obrębie jednej przestrzeni nazw (powiedzmy MyApp) i pozwolić wtyczce użyć innej przestrzeni nazw (powiedzmy CoolPlugin). Kod w MyAppprzestrzeni może po prostu odnosić się User(np. new User();), Podobnie jak kod w CoolPluginprzestrzeni; każdy uzyska oczekiwany wynik. Kiedy potrzebujesz użyć kodu z innej przestrzeni nazw, po prostu go prefiks. Na przykład kod w CoolPluginprzestrzeni może uzyskać dostęp do Userklasy MyAppza pośrednictwemnew \MyApp\User();

Alternatywą jest to, że każda klasa potrzebuje wszędzie złożonej nazwy , takiej jak class MyApp_Useri class CoolPlugin_User. Przestrzenie nazw pozwalają w większości przypadków uprościć sprawy i przez cały czas unikać konfliktów nazw.

Edycja: Aby odpowiedzieć na pytanie: „Czy jest między nimi jakaś różnica w wydajności?”

Nie znaczący, nie. Nie przeprowadziłem testów porównawczych, ale prawdopodobnie istnieje różnica na poziomie nanosekund. To powiedziawszy, poświęcanie jakości kodu dla bardzo małych poprawek wydajności nie jest dobrą strategią, więc powinieneś używać przestrzeni nazw niezależnie. Dla testów porównawczych podobnych problemów zobacz PHPbench.com i tę odpowiedź StackOverflow .

Twój kod musi być niewiarygodnie zwarty i niezwykle wrażliwy na czas (pomyśl o handlu z wysoką częstotliwością lub zarządzaniu reakcjami nuklearnymi), zanim będziesz musiał się martwić mikrooptymalizacją w tym kontekście. Jeśli tak naprawdę jest to czasochłonne, prawdopodobnie powinieneś pisać w a nawet , a nie w interpretowanych językach, takich jak PHP.

eliksenid
źródło
1
+1 Po prostu zauważam, że każdy projekt zaczyna się wydawać, jakby nie mógł potrzebować przestrzeni nazw, a następnie łatwo rośnie do tego stopnia, że ​​hakowanie wokół rzeczy do pracy bez nich staje się śmieszne. Brak przestrzeni nazw to w zasadzie to samo, co deklarowanie każdej zmiennej globalnej, jak ma to zastosowanie do klas. W przypadku większych baz kodu lub tych, które w sposób swobodny korzystają z bibliotek, staje się to całkowitym bałaganem.
BrianH
1
Proszę zobaczyć moją edycję powyżej.
elixenide
2
Czy wspominałem, że tworzę interfejs PHP dla dużego zderzacza hadronów? W przeciwnym razie uważam, że ta odpowiedź jest wystarczająca, dziękuję.
NobleUplift,
1
Nie twórz żadnych gwiazd kwarkowych ani czarnych dziur! Miło, że mogłem pomóc.
elixenide
1
Nie martw się, tylko dziwadła. Tworzymy armaty hadronowe - mam na myśli coś naukowego, a nie zbrojnego.
NobleUplift,