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

В мире PHP пространства имен предназначены для решения двух проблем, с которыми сталкиваются авторы библиотек и приложений при создании повторно используемых элементов кода, таких как классы или функции:

  1. Конфликты имен между создаваемым вами кодом и внутренними классами/функциями/константами PHP или сторонними классами/функциями/константами.
  2. Возможность использовать псевдонимы (или сокращать) Extra_Long_Names, призванные облегчить первую проблему, улучшив читаемость исходного кода.

Пространства имен PHP позволяют группировать связанные классы, интерфейсы, функции и константы. Вот пример синтаксиса пространства имен в PHP:

Пример #1 Пример синтаксиса пространства имен

<?php
namespace my\name; // see "Defining Namespaces" section

class MyClass {}
function myfunction() {}
const MYCONST = 1;

$a = new MyClass;
$c = new \my\name\MyClass; // see "Global Space" section

$a = strlen('hi'); // see "Using namespaces: fallback to global
                   // function/constant" section

$d = namespace\MYCONST; // see "namespace operator and __NAMESPACE__
                        // constant" section
$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); // see "Namespaces and dynamic language features" section
?>

Примечание . Имена пространств имен нечувствительны к регистру.

 

Хотя любой корректный PHP-код может содержаться в пространстве имен, пространства имен затрагивают только следующие типы кода: классы (включая абстракции и трейты), интерфейсы, функции и константы.

Пространства имен объявляются с использованием namespace ключевого слова. Файл, содержащий пространство имен, должен объявлять пространство имен в начале файла перед любым другим кодом, за одним исключением: ключевое слово declare .

Пример #1 Объявление одного пространства имен

<?php
namespace MyProject;

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

?>

Примечание . Полные имена (т. е. имена, начинающиеся с обратной косой черты) не допускаются в объявлениях пространств имен, поскольку такие конструкции интерпретируются как относительные выражения пространства имен.

Единственная конструкция кода, разрешенная перед объявлением пространства имен, — это declareинструкция для определения кодировки исходного файла. Кроме того, код, отличный от PHP, не может предшествовать объявлению пространства имен, включая лишние пробелы:

Пример #2 Объявление одного пространства имен

<html>
<?php
namespace MyProject; // fatal error - namespace must be the first statement in the script
?>

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