Пространства имён в PHP
Пространство имён даёт связанному коду общее имя. Оно не позволяет классам, интерфейсам, функциям и константам конфликтовать с другими, у которых такое же имя.
Эта защита становится важнее по мере роста вашего кода или когда вы объединяете код из нескольких источников.
Зачем нужны пространства имён?
- Они предотвращают конфликты имён, которые становятся вероятнее в крупных проектах
- Они распределяют ваш код по логическим группам
- Они отделяют ваш собственный код от кода библиотек
- Они позволяют нескольким классам безопасно иметь одно и то же имя
Допустим, один набор классов описывает HTML-таблицу (Table, Row, Cell), а другой — мебель (Table, Chair, Bed). Если поместить каждый набор в собственное пространство имён, два класса Table не будут путаться.
Объявление пространства имён
Пространство имён объявляется в начале PHP-файла: напишите namespace, а затем выбранное имя. Во фрагментах кода этого раздела объявляется пространство с именем Html.
Примечание: Расположение строго определено. Объявление должно идти перед всем остальным в файле, поэтому код, размещённый до него, недопустим.
С этого момента каждый класс, интерфейс, функция и константа, объявленные в файле, принадлежат пространству имён Html.
Пространства имён также можно вкладывать друг в друга для более точной организации.
Пример
Здесь класс Table создаётся внутри пространства имён Html:
Вывод: PHP-скрипт
<?php
namespace Html;
class Table {
public $title = "";
public $rows = 0;
public function info() {
echo "<p>$this->title содержит строк: $this->rows.</p>";
}
}
$table = new \Html\Table();
$table->title = "My table";
$table->rows = 5;
?>
<!DOCTYPE html>
<html>
<body>
<?php
$table->info();
?>
</body>
</html>
Объявление пространства имён
Поместите ключевое слово namespace в начало файла:
<?php
namespace Html;
?>
Недопустимое объявление пространства имён
Это недопустимо, потому что перед объявлением пространства имён идёт другой код:
<?php
echo "Hello World!";
namespace Html;
...
?>
Синтаксис вложенного пространства имён
Здесь Html вложено в пространство имён с именем Code:
<?php
namespace Code\Html;
?>
Использование пространств имён
Весь код после объявления пространства имён выполняется внутри этого пространства, поэтому он может создавать его классы по коротким именам, без уточнения. Код вне пространства имён должен добавлять пространство имён к имени класса.
Если вы работаете сразу со многими классами из одного пространства имён, ключевое слово namespace избавляет от лишнего набора текста:
Пример
Чтобы пример можно было запустить, классы определены в блоке namespace Html { }, а остальной код находится в блоке namespace { }, то есть в глобальном пространстве имён. Оттуда к имени каждого класса добавляется префикс Html\, а get_class() выводит полное имя класса каждого объекта:
Вывод: PHP-скрипт
<?php
namespace Html {
class Table {}
class Row {}
}
namespace {
$table = new Html\Table();
$row = new Html\Row();
echo get_class($table) . "\n";
echo get_class($row) . "\n";
}
?>
Пример
После объявления пространства имён Html классам, определённым в нём, больше не нужен префикс Html\. get_class() по-прежнему сообщает их полные имена:
Вывод: PHP-скрипт
<?php
namespace Html;
class Table {}
class Row {}
$table = new Table();
$row = new Row();
echo get_class($table) . "\n";
echo get_class($row) . "\n";
?>
Псевдоним пространства имён
Псевдоним — это более короткое имя, которое вы выбираете для пространства имён или класса, и он упрощает написание кода. Псевдоним задаётся с помощью ключевого слова use:
Пример
Здесь H становится псевдонимом пространства имён Html, поэтому H\Table обозначает тот же класс, что и Html\Table:
Вывод: PHP-скрипт
<?php
namespace Html {
class Table {}
}
namespace {
use Html as H;
$table = new H\Table();
echo get_class($table) . "\n";
}
?>
Пример
Здесь T становится псевдонимом класса Html\Table, поэтому new T() создаёт объект Html\Table:
Вывод: PHP-скрипт
<?php
namespace Html {
class Table {}
}
namespace {
use Html\Table as T;
$table = new T();
echo get_class($table) . "\n";
}
?>