PHP
Пространства имен
Поиск…
замечания
Из документации 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