Zoeken…


Opmerkingen

Uit de PHP-documentatie :

Wat zijn naamruimten? In de breedste definitie zijn naamruimten een manier om items in te kapselen. Dit kan op veel plaatsen als een abstract concept worden gezien. In elk besturingssysteem dienen mappen bijvoorbeeld om gerelateerde bestanden te groeperen en fungeren als een naamruimte voor de bestanden erin. Als concreet voorbeeld kan het bestand foo.txt in zowel directory / home / greg als in / home / other bestaan, maar twee kopieën van foo.txt kunnen niet naast elkaar in dezelfde map bestaan. Om toegang te krijgen tot het bestand foo.txt buiten de map / home / greg, moeten we bovendien de mapnaam voor de bestandsnaam zetten met behulp van het mapscheidingsteken om /home/greg/foo.txt te krijgen. Ditzelfde principe geldt ook voor naamruimten in de programmeerwereld.

Merk op dat naamruimten op het hoogste niveau PHP en php zijn gereserveerd voor de PHP-taal zelf. Ze mogen niet in aangepaste code worden gebruikt.

Naamruimten declareren

Een naamruimtedeclaratie kan er als volgt uitzien:

  • namespace MyProject; - Geef de naamruimte MyProject
  • namespace MyProject\Security\Cryptography; - Geef een geneste naamruimte aan
  • namespace MyProject { ... } - Geef een namespace met omhullende haakjes aan.

Het wordt aanbevolen om slechts één naamruimte per bestand te declareren, hoewel u er zoveel kunt opgeven als u wilt in één bestand:

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.
}

Elke keer dat u een naamruimte declareert, behoren klassen die u daarna definieert tot die naamruimte:

namespace MyProject\Shapes;

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

Een naamruimtedeclaratie kan meerdere keren in verschillende bestanden worden gebruikt. In het bovenstaande voorbeeld zijn drie klassen in de MyProject\Shapes naamruimte in één bestand gedefinieerd. Bij voorkeur wordt dit opgesplitst in drie bestanden, elk beginnend met de namespace MyProject\Shapes; . Dit wordt in het standaardvoorbeeld van de PSR-4 nader toegelicht.

Verwijzen naar een klasse of functie in een naamruimte

Zoals getoond in Naamruimten declareren , kunnen we een klasse in een naamruimte als volgt definiëren:

namespace MyProject\Shapes;

class Rectangle { ... }

Om naar deze klasse te verwijzen, moet het volledige pad (inclusief de naamruimte) worden gebruikt:

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

Dit kan worden ingekort door de klasse te importeren via de use -statement:

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

$rectangle = new Rectangle();

Wat betreft PHP 7.0 kunt u verschillende use groeperen in één enkele instructie met behulp van haakjes:

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();

Soms hebben twee klassen dezelfde naam. Dit is geen probleem als ze zich in een andere naamruimte bevinden, maar het kan een probleem worden wanneer u probeert ze te importeren met de use -statement:

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

Dit kan worden opgelost door zelf een naam voor de alias te definiëren met het trefwoord as :

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

Om te verwijzen naar een klasse buiten de huidige naamruimte, moet deze worden overgeslagen met een \ , anders wordt een relatief naamruimtepad verondersteld uit de huidige naamruimte:

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(); 

Wat zijn naamruimten?

De PHP-community heeft veel ontwikkelaars die veel code maken. Dit betekent dat de PHP-code van een bibliotheek dezelfde klassenaam kan gebruiken als een andere bibliotheek. Wanneer beide bibliotheken in dezelfde naamruimte worden gebruikt, botsen ze en veroorzaken ze problemen.

Namespaces lossen dit probleem op. Zoals beschreven in de PHP-referentiehandleiding kunnen naamruimten worden vergeleken met besturingssysteemmappen die bestanden een naamruimte geven; twee bestanden met dezelfde naam kunnen naast elkaar bestaan in afzonderlijke mappen. Evenzo kunnen twee PHP-klassen met dezelfde naam naast elkaar bestaan in afzonderlijke PHP-naamruimten.

Het is belangrijk voor u om uw code een naamruimte te geven zodat deze door andere ontwikkelaars kan worden gebruikt zonder bang te hoeven zijn voor botsing met andere bibliotheken.

Sub-naamruimten declareren

Gebruik het volgende voorbeeld om een enkele naamruimte met hiërarchie te declareren:

namespace MyProject\Sub\Level;

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

Het bovenstaande voorbeeld maakt:

constant MyProject\Sub\Level\CONNECT_OK

class MyProject\Sub\Level\Connection en

functie MyProject\Sub\Level\connect



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow