Перейти к основному содержимому

Пространства имён в PHP

Пространство имён даёт связанному коду общее имя. Оно не позволяет классам, интерфейсам, функциям и константам конфликтовать с другими, у которых такое же имя.

Эта защита становится важнее по мере роста вашего кода или когда вы объединяете код из нескольких источников.


Зачем нужны пространства имён?

  • Они предотвращают конфликты имён, которые становятся вероятнее в крупных проектах
  • Они распределяют ваш код по логическим группам
  • Они отделяют ваш собственный код от кода библиотек
  • Они позволяют нескольким классам безопасно иметь одно и то же имя

Допустим, один набор классов описывает HTML-таблицу (Table, Row, Cell), а другой — мебель (Table, Chair, Bed). Если поместить каждый набор в собственное пространство имён, два класса Table не будут путаться.


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

Пространство имён объявляется в начале PHP-файла: напишите namespace, а затем выбранное имя. Во фрагментах кода этого раздела объявляется пространство с именем Html.

Примечание: Расположение строго определено. Объявление должно идти перед всем остальным в файле, поэтому код, размещённый до него, недопустим.

С этого момента каждый класс, интерфейс, функция и константа, объявленные в файле, принадлежат пространству имён Html.

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

Пример

Здесь класс Table создаётся внутри пространства имён Html:

Prompt
Создайте PHP-пространство имён Html с классом Table, у которого есть свойство $title, свойство $rows и метод info(), выводящий заголовок и число строк. Создайте экземпляр класса Table, задайте его title значение "My table", а rows — 5, затем вызовите метод info().
Вывод: PHP-скрипт

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

Поместите ключевое слово namespace в начало файла:

index.php
<?php
namespace Html;
?>

Недопустимое объявление пространства имён

Это недопустимо, потому что перед объявлением пространства имён идёт другой код:

index.php
<?php
echo "Hello World!";
namespace Html;
...
?>

Синтаксис вложенного пространства имён

Здесь Html вложено в пространство имён с именем Code:

index.php
<?php
namespace Code\Html;
?>

Использование пространств имён

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

Если вы работаете сразу со многими классами из одного пространства имён, ключевое слово namespace избавляет от лишнего набора текста:

Пример

Чтобы пример можно было запустить, классы определены в блоке namespace Html { }, а остальной код находится в блоке namespace { }, то есть в глобальном пространстве имён. Оттуда к имени каждого класса добавляется префикс Html\, а get_class() выводит полное имя класса каждого объекта:

Prompt
Напишите PHP-код, который определяет классы Table и Row в пространстве имён Html, создаёт по экземпляру каждого из глобального пространства имён, указывая пространство имён вместе с именем класса, и выводит полное имя класса каждого объекта с помощью get_class().
Вывод: PHP-скрипт

Пример

После объявления пространства имён Html классам, определённым в нём, больше не нужен префикс Html\. get_class() по-прежнему сообщает их полные имена:

Prompt
Напишите PHP-код внутри пространства имён Html, который определяет классы Table и Row, создаёт их экземпляры без указания префикса Html\ и выводит полное имя класса каждого объекта с помощью get_class().
Вывод: PHP-скрипт

Псевдоним пространства имён

Псевдоним — это более короткое имя, которое вы выбираете для пространства имён или класса, и он упрощает написание кода. Псевдоним задаётся с помощью ключевого слова use:

Пример

Здесь H становится псевдонимом пространства имён Html, поэтому H\Table обозначает тот же класс, что и Html\Table:

Prompt
Напишите PHP-код, который определяет класс Table в пространстве имён Html, с помощью ключевого слова use задаёт пространству имён псевдоним H, создаёт новый экземпляр Table через этот псевдоним и выводит полное имя класса объекта с помощью get_class().
Вывод: PHP-скрипт

Пример

Здесь T становится псевдонимом класса Html\Table, поэтому new T() создаёт объект Html\Table:

Prompt
Напишите PHP-код, который определяет класс Table в пространстве имён Html, с помощью ключевого слова use задаёт классу Html\Table псевдоним T, создаёт новый экземпляр через этот псевдоним и выводит полное имя класса объекта с помощью get_class().
Вывод: PHP-скрипт