Namnupplösningsregler

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Namnupplösningsregler

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

För att förstå dessa namnupplösningsregler, här är några viktiga definitioner:

Namnrymdsdefinitioner

  • Okvalificerat namn: Detta är en identifierare utan en namnrymdsseparator, till exempel Foo.
  • Kvalificerat namn: Detta är en identifierare med en namnrymdsseparator, till exempel Foo\Bar.
  • Fullt kvalificerat namn: Detta är en identifierare med en namnrymdsseparator som börjar med en namnrymdsseparator, till exempel \Foo\Bar. Namnrymden \Foo är också ett fullt kvalificerat namn.
  • Relativt namn: Detta är en identifierare som börjar med namespace, till exempel namespace\Foo\Bar.

Namn upplöses enligt följande regler:

  1. Fullt kvalificerade namn löses alltid till namnet utan ledande namnrymdsseparator. Till exempel, \A\B löses till A\B.
  2. Relativa namn löses alltid till namnet med namespace ersatt av den aktuella namnrymden. Om namnet förekommer i den globala namnrymden, tas namespace\ prefixet bort. Till exempel namespace\A inom namnrymden X\Y löses till X\Y\A. Samma namn inom den globala namnrymden löses till A.
  3. För kvalificerade namn översätts det första segmentet av namnet enligt den aktuella klass-/namnrymdsimporttabellen. Till exempel, om namnrymden A\B\C importeras som C, översätts namnet C\D\E till A\B\C\D\E.
  4. För kvalificerade namn, om ingen importrule gäller, läggs den aktuella namnrymden till namnet. Till exempel, namnet C\D\E inom namnrymden A\B, löses till A\B\C\D\E.
  5. För okvalificerade namn översätts namnet enligt den aktuella importtabellen för den respektive symboltypen. Detta innebär att namn som liknar klasser översätts enligt klass-/namnrymdsimporttabellen, funktionsnamn enligt funktionens importtabell och konstanter enligt konstantens importtabell. Till exempel, efter use A\B\C; kommer en användning som new C() att lösas till namnet A\B\C(). På samma sätt, efter use function A\B\foo; kommer en användning som foo() att lösas till namnet A\B\foo.
  6. För okvalificerade namn, om ingen importrule gäller och namnet refererar till en klassliknande symbol, läggs den aktuella namnrymden till. Till exempel new C() inom namnrymden A\B löses till namnet A\B\C.
  7. För okvalificerade namn, om ingen importrule gäller och namnet refererar till en funktion eller konstant och koden är utanför den globala namnrymden, löses namnet vid körning. Om koden är i namnrymden A\B, här är hur ett anrop till funktionen foo() löses:
 * Den söker efter en funktion från den aktuella namnrymden: A\B\foo().
 * Den försöker hitta och anropa den globala funktionen foo().

Exempel #1 Namnupplösningar illustrerade

<?php
namespace A;
use B\D, C\E as F;

// funktionsanrop

foo();      // försöker först anropa "foo" definierad i namnrymden "A"
            // sedan anropa global funktion "foo"

\foo();     // anropar funktionen "foo" definierad i globalt omfång

my\foo();   // anropar funktionen "foo" definierad i namnrymden "A\my"

F();        // försöker först anropa "F" definierad i namnrymden "A"
            // sedan anropa global funktion "F"

// klassreferenser

new B();    // skapar objekt av klassen "B" definierad i namnrymden "A"
            // om ej hittad, försöker autoladda klassen "A\B"

new D();    // med hjälp av importrules skapar objekt av klassen "D" definierad i namnrymden "B"
            // om ej hittad, försöker autoladda klassen "B\D"

new F();    // med hjälp av importrules skapar objekt av klassen "E" definierad i namnrymden "C"
            // om ej hittad, försöker autoladda klassen "C\E"

new \B();   // skapar objekt av klassen "B" definierad i globalt omfång
            // om ej hittad, försöker autoladda klassen "B"

new \D();   // skapar objekt av klassen "D" definierad i globalt omfång
            // om ej hittad, försöker autoladda klassen "D"

new \F();   // skapar objekt av klassen "F" definierad i globalt omfång
            // om ej hittad, försöker autoladda klassen "F"

// statiska metoder/namnrymdsfunktioner från en annan namnrymd

B\foo();    // anropar funktionen "foo" från namnrymden "A\B"

B::foo();   // anropar metoden "foo" av klassen "B" definierad i namnrymden "A"
            // om klassen "A\B" inte hittas, försöker autoladda klassen "A\B"

D::foo();   // med hjälp av importrules, anropar metoden "foo" av klassen "D" definierad i namnrymden "B"
            // om klassen "B\D" inte hittas, försöker autoladda klassen "B\D"

\B\foo();   // anropar funktionen "foo" från namnrymden "B"

\B::foo();  // anropar metoden "foo" av klassen "B" från globalt omfång
            // om klassen "B" inte hittas, försöker autoladda klassen "B"

// statiska metoder/namnrymdsfunktioner i den aktuella namnrymden

A\B::foo();   // anropar metoden "foo" av klassen "B" från namnrymden "A\A"
              // om klassen "A\A\B" inte hittas, försöker autoladda klassen "A\A\B"

\A\B::foo();  // anropar metoden "foo" av klassen "B" från namnrymden "A"
              // om klassen "A\B" inte hittas, försöker autoladda klassen "A\B"
?>


Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.namespaces.rules.php
PHP
Språkreferens
Språkreferens#Namnrymder


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/