Ich habe kürzlich angefangen, Namespaces in PHP zu verwenden. Als ich sie zum ersten Mal sah, dachte ich, dass ihre Syntax hässlich ist und ich sie niemals verwenden würde. Ich habe jedoch einen Autoloader (spl_autoload_register) erstellt, mit dem ich nie wieder eine include / require-Anweisung schreiben muss.
Ich mag Namespaces, aber gibt es einen objektiven Vorteil gegenüber include / require-Anweisungen, oder handelt es sich um genau die gleiche Methode, um dasselbe Ziel zu erreichen?
new \Vendor\Namespace\Class()
in der Methode oder Klasse Inline ohne eine Anforderung.Antworten:
Namespaces dienen nicht nur zum automatischen Laden von Klassen. Sie verhindern auch Namenskonflikte. In der Tat ist das ihr Hauptzweck.
Angenommen, Sie haben ein Projekt, das eine Klasse mit dem Namen
User
zum Speichern von Informationen über Benutzer Ihrer Anwendung benötigt. Ein Plug-in verwendet jedoch auch eine (andere) Klasse mit dem NamenUser
zum Speichern von Informationen. Mit Namespaces können Sie Ihre Klasse in einem Namespace erstellen (sagen wir,MyApp
) und das Plugin einen anderen Namespace verwenden lassen (sagen wir,CoolPlugin
). Code imMyApp
Raum kann sich nur aufUser
(z. B.new User();
) beziehen und kann auch imCoolPlugin
Raum codieren . Jeder wird das erwartete Ergebnis erhalten. Wenn Sie Code aus einem anderen Namespace verwenden müssen, müssen Sie ihm lediglich ein Präfix voranstellen. Beispielsweise kann Code imCoolPlugin
Space über auf dieUser
KlasseMyApp
zugreifennew \MyApp\User();
Die Alternative ist, dass jede Klasse überall einen komplexen Namen benötigt , wie z. B.
class MyApp_User
undclass CoolPlugin_User
. Mit Namespaces können Sie die Dinge die meiste Zeit vereinfachen und Namenskonflikte vermeiden.Bearbeiten: Um die Frage zu beantworten: "Gibt es einen Leistungsunterschied zwischen den beiden?"
Kein aussagekräftiger, nein. Ich habe es nicht verglichen, aber es gibt wahrscheinlich einen Unterschied auf der Nanosekundenebene. Trotzdem ist es keine gute Strategie, die Codequalität für extrem kleine Leistungsverbesserungen zu opfern. Daher sollten Sie unabhängig davon Namespaces verwenden. Benchmarks für ähnliche Arten von Problemen finden Sie unter PHPbench.com und in dieser StackOverflow-Antwort .
Ihr Code muss unglaublich eng und unglaublich zeitkritisch sein (denken Sie an Hochfrequenzhandel oder das Management von Kernreaktionen), bevor Sie sich Gedanken über die Mikrooptimierung in einem solchen Kontext machen müssen. Wenn es wirklich so zeitkritisch ist, sollten Sie wahrscheinlich in c oder sogar in Assembler codieren und keine Sprachen wie PHP interpretieren.
quelle