Szukaj…


Uwagi

Z dokumentacji PHP :

Jakie są przestrzenie nazw? W najszerszej definicji przestrzenie nazw są sposobem kapsułkowania elementów. W wielu miejscach można to postrzegać jako abstrakcyjną koncepcję. Na przykład w dowolnym systemie operacyjnym katalogi służą do grupowania powiązanych plików i działają jako przestrzeń nazw dla plików w nich zawartych. Jako konkretny przykład plik foo.txt może istnieć zarówno w katalogu / home / greg, jak i w / home / other, ale dwie kopie pliku foo.txt nie mogą istnieć w tym samym katalogu. Ponadto, aby uzyskać dostęp do pliku foo.txt poza katalogiem / home / greg, musimy dodać nazwę katalogu do nazwy pliku za pomocą separatora katalogów, aby uzyskać /home/greg/foo.txt. Ta sama zasada dotyczy przestrzeni nazw w świecie programowania.

Zauważ, że przestrzenie nazw najwyższego poziomu PHP i php są zarezerwowane dla samego języka PHP. Nie należy ich używać w żadnym niestandardowym kodzie.

Deklarowanie przestrzeni nazw

Deklaracja przestrzeni nazw może wyglądać następująco:

  • namespace MyProject; - Zadeklaruj przestrzeń nazw MyProject
  • namespace MyProject\Security\Cryptography; - Zadeklaruj zagnieżdżoną przestrzeń nazw
  • namespace MyProject { ... } - Zadeklaruj przestrzeń nazw za pomocą nawiasów klamrowych.

Zaleca się deklarowanie tylko jednego obszaru nazw dla pliku, nawet jeśli w jednym pliku można zadeklarować dowolną liczbę:

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

Za każdym razem, gdy deklarujesz przestrzeń nazw, zdefiniowane po niej klasy będą należeć do tej przestrzeni nazw:

namespace MyProject\Shapes;

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

Deklaracja przestrzeni nazw może być używana wielokrotnie w różnych plikach. W powyższym przykładzie zdefiniowano trzy klasy w przestrzeni nazw MyProject\Shapes w jednym pliku. Najlepiej byłoby podzielić je na trzy pliki, każdy rozpoczynający się od namespace MyProject\Shapes; . Jest to wyjaśnione bardziej szczegółowo w standardowym przykładzie PSR-4.

Odwoływanie się do klasy lub funkcji w przestrzeni nazw

Jak pokazano w Declaring Namespaces , możemy zdefiniować klasę w przestrzeni nazw w następujący sposób:

namespace MyProject\Shapes;

class Rectangle { ... }

Aby odwołać się do tej klasy, należy użyć pełnej ścieżki (w tym przestrzeni nazw):

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

Można to skrócić, importując klasę za use -statement:

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

$rectangle = new Rectangle();

Jeśli chodzi o PHP 7.0, możesz pogrupować różne informacje o use w jednej instrukcji za pomocą nawiasów:

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

Czasami dwie klasy mają tę samą nazwę. To nie jest problem, jeśli są one w innej przestrzeni nazw, ale może stać się problemem, gdy próbuje importować je z use -statement:

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

Można to rozwiązać poprzez samodzielne określenie nazwy aliasu za pomocą słowa kluczowego as :

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

Aby odwołać się do klasy spoza bieżącej przestrzeni nazw, należy ją poprzedzić znakiem \ , w przeciwnym razie zakłada się względną ścieżkę przestrzeni nazw z bieżącej przestrzeni nazw:

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

Co to są przestrzenie nazw?

Społeczność PHP ma wielu programistów tworzących dużo kodu. Oznacza to, że kod PHP jednej biblioteki może używać tej samej nazwy klasy co inna biblioteka. Gdy obie biblioteki są używane w tej samej przestrzeni nazw, kolidują i powodują problemy.

Przestrzenie nazw rozwiązują ten problem. Jak opisano w podręczniku PHP, przestrzenie nazw można porównać do katalogów systemu operacyjnego, które przechowują pliki przestrzeni nazw; dwa pliki o tej samej nazwie mogą współistnieć w oddzielnych katalogach. Podobnie, dwie klasy PHP o tej samej nazwie mogą współistnieć w oddzielnych przestrzeniach nazw PHP.

Ważne jest, abyś nazwał swój kod, aby mógł być używany przez innych programistów bez obawy o kolizję z innymi bibliotekami.

Deklarowanie przestrzeni nazw podrzędnych

Aby zadeklarować pojedynczą przestrzeń nazw z hierarchią, skorzystaj z następującego przykładu:

namespace MyProject\Sub\Level;

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

Powyższy przykład tworzy:

stała MyProject\Sub\Level\CONNECT_OK

klasa MyProject\Sub\Level\Connection i

funkcja MyProject\Sub\Level\connect



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow