PHP
downloads | documentation | faq | getting help | mailing lists | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Ausnahmebehandlung> <Namensräume
Last updated: Fri, 14 Nov 2008

view this page in

Regeln der Namensauflösung

Namen werden entsprechend der folgenden Regeln aufgelöst.

  1. 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() zu A::B::C::D::e umgeschrieben.
  2. 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() in new A::B::C umgeschrieben.
  3. 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
  4. 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:
    1. Es wird nach einer Funktion im aktuellen Namensraum gesucht: A::B::foo().
    2. Es sird versucht eine interne Funktion foo() zu finden und aufzurufen.
    Soll eine benutzerdefinierte Funktion im globalen Namensraum aufgerufen werden, so muss ::foo() benutzt werden.
  5. 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:
    1. Es wird nach einer Klasse im aktuellen Namensraum gesucht: A::B::C.
    2. Es wird versucht, eine interne Klasse C zu finden.
    3. Es wird versucht, A::B::C automatisch zu laden.
    Um eine benutzerdefinierte Klasse im globalen Namensraum zu nutzen, muss new ::C() verwendet werden.
  6. Aufrufe qualifizierter Funktionen werden zur Laufzeit aufgelöst. Ein Aufruf von A::B::foo() wird folgendermaßen aufgelöst:
    1. Es wird nach einer Funktion foo im Namensraum A::B gesucht.
    2. Es wird nach einer Klasse A::B mit einer statischen Methode foo() gesucht. Die Klasse wird wenn nötig automatisch geladen.
  7. 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
?>


add a note add a note User Contributed Notes
Regeln der Namensauflösung
sean dot mccleary at gmail dot com
08-Oct-2008 07:28
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.
Will
20-Feb-2008 11: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();

?>

Ausnahmebehandlung> <Namensräume
Last updated: Fri, 14 Nov 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites