Поиск…


замечания

Из документации PHP :

Что такое пространства имен? В самом широком определении пространства имен являются способом инкапсуляции элементов. Во многих местах это можно рассматривать как абстрактную концепцию. Например, в любой операционной системе каталоги служат для группировки связанных файлов и действуют как пространство имен для файлов внутри них. В качестве конкретного примера файл foo.txt может существовать как в каталоге / home / greg, так и в / home / other, но две копии foo.txt не могут сосуществовать в одном каталоге. Кроме того, чтобы получить доступ к файлу foo.txt за пределами каталога / home / greg, мы должны добавить имя каталога к имени файла, используя разделитель каталога, чтобы получить /home/greg/foo.txt. Этот же принцип распространяется на пространства имен в мире программирования.

Обратите внимание, что пространства имен верхнего уровня PHP и php зарезервированы для самого языка PHP. Они не должны использоваться в каком-либо специальном коде.

Объявление пространств имен

Объявление пространства имен может выглядеть следующим образом:

  • namespace MyProject; - Объявить пространство имен MyProject
  • namespace MyProject\Security\Cryptography; - Объявить вложенное пространство имен
  • namespace MyProject { ... } - объявить пространство имен с прилагаемыми скобками.

Рекомендуется указывать только одно пространство имен для каждого файла, даже если вы можете объявить столько, сколько хотите в одном файле:

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

Каждый раз, когда вы объявляете пространство имен, классы, которые вы определяете после этого, будут принадлежать этому пространству имен:

namespace MyProject\Shapes;

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

Объявление пространства имен может использоваться несколько раз в разных файлах. В приведенном выше примере определены три класса в пространстве имен MyProject\Shapes в одном файле. Предпочтительно, это будет разделено на три файла, каждый из которых начинается с namespace MyProject\Shapes; , Это объясняется более подробно в стандартном примере PSR-4.

Ссылка на класс или функцию в пространстве имен

Как показано в разделе «Проявление пространств имен» , мы можем определить класс в пространстве имен следующим образом:

namespace MyProject\Shapes;

class Rectangle { ... }

Чтобы ссылаться на этот класс, необходимо использовать полный путь (включая пространство имен):

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

Это можно сократить, импортировав класс через use -statement:

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

$rectangle = new Rectangle();

Что касается PHP 7.0, вы можете группировать различные варианты use в одном объявлении с помощью скобок:

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

Иногда два класса имеют одно и то же имя. Это не проблема, если они находятся в другом пространстве имен, но это может стать проблемой при попытке импортировать их с use -statement:

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

Это можно решить, указав имя для псевдонима самостоятельно, используя ключевое слово as :

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

Чтобы ссылаться на класс за пределами текущего пространства имен, он должен быть экранирован с помощью \ , в противном случае из текущего пространства имен предполагается относительный путь пространства имен:

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

Что такое пространство имен?

В сообществе PHP есть много разработчиков, создающих много кода. Это означает, что PHP-код одной библиотеки может использовать то же имя класса, что и другая библиотека. Когда обе библиотеки используются в одном и том же пространстве имен, они сталкиваются и вызывают проблемы.

Пространства имен решают эту проблему. Как описано в справочном руководстве по PHP, пространства имен можно сравнить с каталогами операционной системы, которые используют файлы пространств имен; два файла с тем же именем могут сосуществовать в отдельных каталогах. Аналогично, два класса PHP с таким же именем могут сосуществовать в разных пространствах имен PHP.

Важно, чтобы вы прописали свой код, чтобы его могли использовать другие разработчики, не опасаясь столкновения с другими библиотеками.

Объявление пространств имен

Чтобы объявить одно пространство имен с иерархией, используйте следующий пример:

namespace MyProject\Sub\Level;

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

В приведенном выше примере создается:

константа MyProject\Sub\Level\CONNECT_OK

класс MyProject\Sub\Level\Connection и

функция MyProject\Sub\Level\connect



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow