Sök…


Anmärkningar

Från PHP-dokumentationen :

Vad är namnutrymmen? I den bredaste definitionen är namnutrymmen ett sätt att inkapsla objekt. Detta kan ses som ett abstrakt koncept på många ställen. Till exempel tjänar kataloger i operativsystem för att gruppera relaterade filer och fungera som ett namnområde för filerna inom dem. Som ett konkret exempel kan filen foo.txt existera i både katalog / hem / greg och i / hem / annat, men två kopior av foo.txt kan inte samexistera i samma katalog. För att få åtkomst till foo.txt-filen utanför / home / greg-katalogen måste vi dessutom bero katalognamnet på filnamnet med katalogseparatorn för att få /home/greg/foo.txt. Samma princip sträcker sig till namnområden i programmeringsvärlden.

Observera att toppytans namnutrymmen PHP och php är reserverade för själva PHP-språket. De ska inte användas i någon anpassad kod.

Förklarande namnutrymmen

En namnutrymmesdeklaration kan se ut enligt följande:

  • namespace MyProject; - Förklara namnområdet MyProject
  • namespace MyProject\Security\Cryptography; - Förklara ett kapslad namnutrymme
  • namespace MyProject { ... } - Förklara ett namnområde med bifogade parenteser.

Det rekommenderas att endast deklarera ett enda namnutrymme per fil, även om du kan förklara så många du vill i en enda fil:

namespace First {
    class A { ... }; // Define class A in the namespace First.
}

namespace Second {
    class B { ... }; // Define class B in the namespace Second.
}

namespace {
    class C { ... }; // Define class C in the root namespace.
}

Varje gång du förklarar ett namnområde, klasser som du definierar efter det kommer att tillhöra det namnområdet:

namespace MyProject\Shapes;

class Rectangle { ... }
class Square { ... }
class Circle { ... }

En namnutrymmesdeklaration kan användas flera gånger i olika filer. Exemplet ovan definierade tre klasser i MyProject\Shapes i en enda fil. Företrädesvis skulle detta delas upp i tre filer, var och en börjar med namespace MyProject\Shapes; . Detta förklaras mer detaljerat i PSR-4-standardexemplet.

Referera till en klass eller funktion i ett namnområde

Som visas i förklarande namnytor kan vi definiera en klass i ett namnutrymme enligt följande:

namespace MyProject\Shapes;

class Rectangle { ... }

För att referera till denna klass måste hela sökvägen (inklusive namnutrymmet) användas:

$rectangle = new MyProject\Shapes\Rectangle();

Detta kan förkortas genom att importera klassen via use :

// Rectangle becomes an alias to MyProject\Shapes\Rectangle
use MyProject\Shapes\Rectangle;

$rectangle = new Rectangle();

När det gäller PHP 7.0 kan du gruppera olika use i en enda sats med hjälp av parenteser:

use MyProject\Shapes\{
    Rectangle,         //Same as `use MyProject\Shapes\Rectangle`
    Circle,            //Same as `use MyProject\Shapes\Circle`
    Triangle,          //Same as `use MyProject\Shapes\Triangle`
    
    Polygon\FiveSides, //You can also import sub-namespaces
    Polygon\SixSides   //In a grouped `use`-statement
};

$rectangle = new Rectangle();

Ibland har två klasser samma namn. Detta är inte ett problem om de finns i ett annat namnutrymme, men det kan bli ett problem när du försöker importera dem med use :

use MyProject\Shapes\Oval;
use MyProject\Languages\Oval; // Apparantly Oval is also a language!
// Error!

Detta kan lösas genom att definiera ett namn för alias själv med hjälp av as sökord:

use MyProject\Shapes\Oval as OvalShape;
use MyProject\Languages\Oval as OvalLanguage;

För att hänvisa till en klass utanför det aktuella namnutrymmet måste den flydas med en \ , annars antas en relativ namnsyta sökväg från det aktuella namnområdet:

namespace MyProject\Shapes;

// References MyProject\Shapes\Rectangle. Correct!
$a = new Rectangle();

// References MyProject\Shapes\Rectangle. Correct, but unneeded!
$a = new \MyProject\Shapes\Rectangle(); 

// References MyProject\Shapes\MyProject\Shapes\Rectangle. Incorrect!
$a = new MyProject\Shapes\Rectangle(); 


// Referencing StdClass from within a namespace requires a \ prefix
// since it is not defined in a namespace, meaning it is global.

// References StdClass. Correct!
$a = new \StdClass(); 

// References MyProject\Shapes\StdClass. Incorrect!
$a = new StdClass(); 

Vad är namnområden?

PHP-communityn har många utvecklare som skapar massor av kod. Detta innebär att ett biblioteks PHP-kod kan använda samma klassnamn som ett annat bibliotek. När båda biblioteken används i samma namnområde kolliderar de och orsakar problem.

Namnytor löser problemet. Som beskrivs i PHP-referenshandboken kan namnutrymmen jämföras med operativsystemkataloger som namnutrymme-filer; två filer med samma namn kan samexistera i separata kataloger. På samma sätt kan två PHP-klasser med samma namn samexistera i separata PHP-namnutrymmen.

Det är viktigt för dig att namnge din kod så att den kan användas av andra utvecklare utan rädsla för att kollidera med andra bibliotek.

Förklara underområden

För att förklara ett enda namnutrymme med hierarki använd följande exempel:

namespace MyProject\Sub\Level;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

Exemplet ovan skapar:

konstant MyProject\Sub\Level\CONNECT_OK

klass MyProject\Sub\Level\Connection och

funktion MyProject\Sub\Level\connect



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow