Watch out if you're using class auto-loading.
If you are working in namespace "A", and want to auto-load the class "Person" which is defined in the global namespace, it won't work because the __autoload function will be passed "A::Person" as a parameter.
You must specify you want to use the class ::Person.
Regeln der Namensauflösung
Namen werden entsprechend der folgenden Regeln aufgelöst.
-
Alle qualifizierten Namen werden zur Kompilezeit gemäß der Importregeln
umgeschrieben. Wird z.B. A::B::C importiert, so wird ein Aufruf von
C::D::e()zuA::B::C::D::eumgeschrieben. -
Unqualifizierte Namen werden zur Kompilezeit gemäß der aktuell gültigen
Importregeln umgesetzt (der vollständige Name ersetzt den kurzen
Importnamen). Wird z.B. der Namensraum A::B::C
importiert, so wird
new C()innew A::B::Cumgeschrieben. - Innerhalb eines Namensraums werden unqualifizierte Funktionen, die im aktuellen Namensraum definiert (und zum Zeitpunkt des Aufrufs bereits bekannt) sind, zur Kompilezeit als Aufrufe dieser Namensraumfunktionen interpretiert
-
Innerhalb eines Namensraumes (z.B. A::B) werden
Aufrufe unqualifizierter Funktion, die nicht im aktuellen Namensraum
definiert sind, zur Laufzeit aufgelöst. Ein Aufruf einer Funktion
foo() wird folgendermaßen aufgelöst:
- Es wird nach einer Funktion im aktuellen Namensraum gesucht: A::B::foo().
- Es sird versucht eine interne Funktion foo() zu finden und aufzurufen.
-
Innerhalb eines Namensraumes (z.B. A::B) werden
Aufrufe unqualifizierter Klassen zur Laufzeit aufgelöst. Ein Aufruf
von
new C()wird dabei folgendermaßen aufgelöst:- Es wird nach einer Klasse im aktuellen Namensraum gesucht: A::B::C.
- Es wird versucht, eine interne Klasse C zu finden.
- Es wird versucht, A::B::C automatisch zu laden.
new ::C()verwendet werden. -
Aufrufe qualifizierter Funktionen werden zur Laufzeit aufgelöst.
Ein Aufruf von A::B::foo() wird folgendermaßen
aufgelöst:
- Es wird nach einer Funktion foo im Namensraum A::B gesucht.
- Es wird nach einer Klasse A::B mit einer statischen Methode foo() gesucht. Die Klasse wird wenn nötig automatisch geladen.
-
Qualifizierte Klassennamen werden zur Kompilezeit als Klassen des
korrespondierenden Namensraumes aufgelöst. So referenziert z.B.
new A::B::C()auf die Klasse C aus dem Namensraum A::B.
Beispiel #1 Illustration der Namensauflösung
<?php
namespace A;
// Funktionsaufrufe
foo(); // zunächst wird versucht, "foo" aus Namensraum "A" aufzurufen,
// danach die interne Funktion "foo"
::foo(); // ruft die im globalen Namensraum definierte Funktion "foo" auf
// Klassenreferenzen
new B(); // zunächst wird versucht, ein Objekt der Klasse "B" im Namensraum "A" zu erzeugen,
// danach ein Objekt der internen Klasse "B"
new ::B(); // erzeugt ein Objekt der Klasse "B" im globalen Namensraum "A"
// statische Methode oder Namensraumfunktion aus einem anderen Namensraum
B::foo(); // versucht zunächst die Funktion "foo" aus Namensraum "A::B" aufzurufen,
// danach die Methode "foo" einer internen Klasse "B"
::B::foo(); // versucht zunächst die Funktion "foo" aus Namensraum "B" aufzurufen,
// danach die Methode "foo" aus Klasse "B" im globalen Namensraum
// statische Methoden oder Namensraumfunktionen im aktuellen Namensraum
A::foo(); // versucht zunächst die Funktion "foo" im Namensraum "A::A" aufzurufen,
// danach die Methode "foo" der Klasse "A" im Namensraum "A",
// dann die Funktion "foo" aus Namensraum "A"
// und schließlich die Methode "foo" der internen Klasse "A"
::A::foo(); // versucht zunächst die Funktion "foo" aus Namensraum "A" aufzurufen,
// danach die Methode "foo" der Klasse "A" aus dem globalen Namensraum
?>
Regeln der Namensauflösung
sean dot mccleary at gmail dot com
09-Oct-2008 02:28
09-Oct-2008 02:28
Will
20-Feb-2008 06:08
20-Feb-2008 06:08
Agreed. Dennis is right on with this. To add on, requiring each file that includes a namespace also defeats the purpose of namespacing. It makes more sense if you have a repository for namespaces and just use those.
Example:
/some/path/to/namespaces/
<?php
use Some::Namespace;
// Test is withing Namespace.
$t = new Test();
// Test2 is not, so it checks includes, etc.
$t = new Test2();
?>
