Vor- und Nachteile von Namespaces vs include / require in PHP?

20

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?

NobleUplift
quelle
1
Namespaces verhindern Kollisionen mit Bibliotheken von Drittanbietern.
Reactgular
1
Momentan ist der Hauptvorteil für mich in Bezug auf Namespaces das automatische Laden. Zum Beispiel verwende ich new \Vendor\Namespace\Class()in der Methode oder Klasse Inline ohne eine Anforderung.
NobleUplift
3
Viele PHP-Bibliotheken verwenden das automatische Laden ohne Namespaces. PHP sollte Namespaces obligatorisch machen.
Reactgular
Kein Argument von mir. Ich würde gerne alle diese Änderungen hier sehen .
NobleUplift

Antworten:

21

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 Userzum Speichern von Informationen über Benutzer Ihrer Anwendung benötigt. Ein Plug-in verwendet jedoch auch eine (andere) Klasse mit dem Namen Userzum 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 im MyAppRaum kann sich nur auf User(z. B. new User();) beziehen und kann auch im CoolPluginRaum 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 im CoolPluginSpace über auf die UserKlasse MyAppzugreifennew \MyApp\User();

Die Alternative ist, dass jede Klasse überall einen komplexen Namen benötigt , wie z. B. class MyApp_Userund class 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 oder sogar in codieren und keine Sprachen wie PHP interpretieren.

Elixenid
quelle
1
+1 Ich stelle lediglich fest, dass jedes Projekt so aussieht, als ob es möglicherweise keine Namespaces mehr benötigen könnte, und dass es dann leicht lächerlich wird, Dinge zu hacken, die ohne sie funktionieren. Das Fehlen von Namespaces ist im Grunde dasselbe wie das Deklarieren jeder Variablen global für Klassen. Auf größeren Codebasen oder solchen, die Bibliotheken liberal nutzen, wird es zu einem völligen Durcheinander.
BrianH
1
Bitte beachten Sie meine Bearbeitung oben.
Elixenide
2
Habe ich erwähnt, dass ich eine PHP-Schnittstelle für den Large Hadron Collider erstelle? Ansonsten halte ich diese Antwort für ausreichend, danke.
NobleUplift
1
Bitte keine Quarksterne oder schwarzen Löcher erzeugen! Froh, dass ich Helfen kann.
Elixenide
1
Mach dir keine Sorgen, nur Strangelets. Wir erschaffen Hadronenkanonen - ich meine, etwas Wissenschaftliches und keine Waffen.
NobleUplift