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?
new \Vendor\Namespace\Class()
bez instrukcji request wcześniej w metodzie lub klasie.Odpowiedzi:
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
User
do przechowywania informacji o użytkownikach aplikacji, ale wtyczka używa także (innej) klasy o nazwieUser
do przechowywania informacji. Przestrzenie nazw pozwalają tworzyć klasę w obrębie jednej przestrzeni nazw (powiedzmyMyApp
) i pozwolić wtyczce użyć innej przestrzeni nazw (powiedzmyCoolPlugin
). Kod wMyApp
przestrzeni może po prostu odnosić sięUser
(np.new User();
), Podobnie jak kod wCoolPlugin
przestrzeni; każdy uzyska oczekiwany wynik. Kiedy potrzebujesz użyć kodu z innej przestrzeni nazw, po prostu go prefiks. Na przykład kod wCoolPlugin
przestrzeni może uzyskać dostęp doUser
klasyMyApp
za pośrednictwemnew \MyApp\User();
Alternatywą jest to, że każda klasa potrzebuje wszędzie złożonej nazwy , takiej jak
class MyApp_User
iclass 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 c, a nawet asemblerze , a nie w interpretowanych językach, takich jak PHP.
źródło