Namnupplösningsregler
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:
- Fullt kvalificerade namn löses alltid till namnet utan ledande namnrymdsseparator. Till exempel, \A\B löses till A\B.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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/