|
FAQ: Dinge, die Sie über Namespaces wissen solltenDiese häufig gestellten Fragen (FAQ) wurden in zwei Abschnitte aufgeteilt: allgemeine Fragen und einige Implementierungsdetails, deren vollständiges Verständnis hilfreich sein kann. Zuerst die allgemeinen Fragen.
Es gibt einige Implementierungsdetails von Namespaces, deren Verständnis hilfreich ist.
Wenn ich keine Namespaces verwende, sollte mich das alles hier überhaupt interessieren?Nein. Namespaces haben keinerlei Einfluss auf bereits bestehenden Code oder irgendwelchen Code der noch geschrieben wird, der keine Namespaces verwendet. Sie können folgenden Code schreiben, wenn Sie dies wünschen:
Beispiel #1 Zugriff auf globale Klassen außerhalb eines Namespace
<?phpDies ist äquivalent zu:
Beispiel #2 Zugriff auf globale Klassen außerhalb eines Namespace
<?phpWie verwende ich interne oder globale Klassen in einem Namespace?
Beispiel #3 Zugriff auf interne Klassen in Namespaces
<?phpWie verwende ich Klassen, Funktionen oder Konstanten mit Namespaces in ihrem eignenen Namespace?
Beispiel #4 Zugriff auf interne Klassen, Funktionen oder Konstanten in Namespaces
<?phpWie wird ein Name wie \mein\name oder \name aufgelöst?Namen, die mit einem \ beginnen, werden immer zu exakt dem aufgelöst wie sie aussehen. \mein\name ist also tatsächlich \mein\name und \Exception ist Exception. Beispiel #5 Vollständig qualifizierte Namen
<?phpWie wird ein Name wie mein\name aufgelöst?Namen, die einen Backslash beinhalten, aber nicht mit einem Backslash beginnen, wie z.B. mein\name, können auf zwei verschiedene Arten aufgelöst werden. Falls es einen Import-Ausdruck gibt, der einen Alias für einen anderen Namen definiert, so dass dieser mein heißen soll, dann wird dieser Alias für das mein in mein\name angewandt. Andernfalls wird der aktuelle Namespace vor mein\name vorangestellt.
Beispiel #6 Qualifizierte Namen
<?phpWie wird ein unqualifizierter Name wie name aufgelöst?Klassennamen, die keinen Backslash beinhalten, wie z.B. name, können auf zwei Arten aufgelöst werden. Falls es einen Import-Ausdruck gibt, der einen Alias für einen anderen Namen definiert, so dass dieser name heißen soll, dann wird dieser Alias angewandt. Andernfalls wird der aktuelle Namespace name vorangestellt.
Beispiel #7 Unqualifizierter Klassennamen
<?phpWie wird ein unqualifizierter Funktions- oder Konstantenname wie name aufgelöst?Funktions- oder Konstantennamen, die keinen Backslash beinhalten, wie z.B. name, können auf zwei verschiedene Arten aufgelöst werden. Zuerst wird der aktuelle Namespace dem name vorangestellt. Wenn die Konstante oder Funktion name im aktuellen Namensraum nicht existiert, so wird die globale Konstante oder Funktion name verwendet, wenn sie existiert.
Beispiel #8 Unqualifizierte Funktions- oder Konstantennamen
<?phpImportierte Namen dürfen keine Konflikte mit Klassennamen in der gleichen Datei erzeugen.Die folgende Kombination von Skripten ist gültig: file1.php
<?phpanderes.php
<?phpfile2.php
<?phpEs gibt hier, trotzdem es eine Klasse MyClass im Namespace mein\zeug gibt, keinen Namenskonflikt, weil die Definition der Klasse MyClass sich in einer anderen Datei befindet. Das nächste Beispiel erzeugt hingegen einen fatal error wegen eines Namenskonflikts, weil MyClass in derselben Datei definiert wird, die auch den use-Ausdruck beinhaltet.
<?phpVerschachtelte Namespaces sind nicht erlaubt.PHP erlaubt das Verschachteln von Namespaces nicht.
<?php
<?phpVor PHP 5.6 konnten weder Funktionen noch Konstanten mittels use importiert werden.Vor PHP 5.6 sind die einzigen Elemente, die von einem use-Ausdruck beeinflusst werden, Namespaces und Klassenamen. Um einen langen Konstanten- oder Funktionsnamen abzukürzen, kann dessen beinhaltender Namespace importiert werden.
<?phpDynamische Namespacenamen sollten den Backslash escapen.Es ist wichtig zu bemerken, dass ein Backslash in Strings als Escape-Zeichen verwendet wird und daher immer verdoppelt werden sollte, wenn er in einem String verwendet wird. Andernfalls besteht das Risiko ungewollter Auswirkungen: Beispiel #9 Gefahren von Namespacenamen in Strings mit doppelten Anführungszeichen
<?phpZugriff auf undefinierte Konstanten mit Backslashes beendet das Skript mit einem fatal error.Jeder Zugriff auf eine Konstante mit unqualifiziertem Namen, wie FOO, wird eine Notice erzeugen, welche erklärt, dass PHP angenommen hat, dass FOO der Wert der Konstante sei. Jede Konstante, qualifiziert oder vollständig qualifiziert, deren Name einen Backslash enthält, wird einen fatal error hervorrufen, wenn sie nicht gefunden wurde. Beispiel #10 Undefinierte Konstanten
<?phpDie speziellen Konstanten NULL, TRUE, FALSE, ZEND_THREAD_SAFE und ZEND_DEBUG_BUILD können nicht überschrieben werden.Jeder Versuch, eine Konstante in einem Namespace zu definieren, die eine der speziellen, eingebauten Konstanten ist, wird einen fatal error hervorrufen. Beispiel #11 Spezielle Konstanten
<?php |