[Из песочницы] Пространства имен в PHP

На хабре можно найти немало статей о пространствах имен в PHP, но мне помогла именно эта, и именно ей я хочу поделится. Наверняка найдутся те, кому этот перевод поможет.

Путь к поддержке пространств имен в PHP был тернистым. Но к счастью она была добавлена к языку в версии PHP 5.3, и структура PHP кода значительно улучшилась с тех пор. Но как именно нам их использовать? Что такое пространства имен? «Не забывайте обратный слеш, когда Вы храните имя пространства имен в виде строки!»

Представьте себе пространство имен, как ящик, в который Вы можете положить все что угодно: карандаш, линейку, кусок бумаги и так далее. Это Ваши вещи. Прямо под вашим ящиком, располагается еще чей-то ящик, и его хозяин хранит те же вещи в нем. Чтобы избежать использования предметов друг друга, Вы решили маркировать ящики так чтобы стало ясно, что кому принадлежит.Ранее разработчикам приходилось использовать префиксы с нижним подчеркиванием в своих классах, функциях и константах для разделения кода. Это эквивалентно тому, что каждый будет маркировать свои вещи и храниться они будут в одном большом ящике. Конечно, это по крайней мере хоть какая-то организации, но это очень неэффективно.Пространства имен, помогут! Вы можете объявить одни и те же функцию, класс, интерфейс и определить константу в отдельных пространствах имен, не получая фатальных ошибок. По своей сути, пространство имен не более чем иерархически маркированные блоки кода содержащие обычный PHP код.

Вы используете их! Важно понимать, что Вы косвенно используете пространства имен; Начиная с PHP 5.3, все определения, которые еще не объявлены в определенных пользователем пространствах имен, подпадают под глобальное пространство имен.Глобальное пространство имен также хранит все внутренние определения PHP, такие как echo (), mysqli_connect (), и класс Exception. Поскольку глобальное пространство имен не имеет уникального идентифицирующего названия, его наиболее часто называют глобальное пространство.

Обратите внимание что использование пространства имен не является обязательным.Ваш PHP скрипт будет прекрасно работать без них, и такое поведение не очень скоро измениться.

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

Обратите внимание, что фигурные скобки, совершенно необязательны. На самом деле, используя правило одного пространства имен в одном файле и опуская фигурные скобки Вы делаете ваш код намного чище — нет никакой необходимости, делать отступ (табуляцию) для вложенного кода.Подпространства имен Пространства имен могут следовать определенной иерархии, так же, как каталоги в файловой системе на компьютере. Подпространства имен чрезвычайно полезны для организации структуры проекта. Например, если ваш проект требует доступа к базе данных, Вы можете поместить код обработчика исключений базы данных и обработчика подключения в подпространство имен Database.Для обеспечения гибкости, разумно хранить вложенные пространства имен в подкаталогах. Это способствует структурированию проекта и позволяет гораздо проще использовать его автозагрузчикам, которые следуют стандарту PSR-4.

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

image

Интересный факт: в RFC, чтобы решить, какой разделитель пространства имен следует использовать, рассматривался вариант использования смайлика.

// myproject/database/connection.php Неполное имя Это имя класса, функции или константы, не включающее в себя ссылку к какому бы то ни было пространству имён. Для тех, кто только начинает работать с пространством имен, это привычная точка зрения.

'; } Динамические вызовы PHP — динамический язык программирования; так что Вы можете применять этот функционал для вызова кода из пространства имён. Это, по существу тоже, что использование динамического имени класса или подключение динамического файла используя переменную для хранения его имени. Разделитель имен PHP использует те же метасимволы в строках. Не забывайте про обратный слеш, когда Вы храните имя пространства имен в виде строки!

Важная особенность пространств имен в PHP — это возможность ссылаться на внешнее абсолютное имя по псевдониму, или импортирование.Импорт является очень полезным и фундаментальным аспектом пространства имен. Это дает вам возможность использовать внешние пакеты, например, библиотеки, не беспокоясь о конфликте имен. Импорт осуществляется с помощью ключевого слова use. При желании, Вы можете указать пользовательский псевдоним с помощью ключевого слова as.

use [name of class, interface or namespace] as [optional_custom_alias] Как это использовать Абсолютное имя может быть привязаны к более короткому неполному имени, так что вам не придется писать его абсолютное имя каждый раз, когда Вы хотите его использовать. Создание псевдонима или импорт должны происходить в родительском пространстве имен или в глобальном. Попытка сделать это в рамках метода или функции является недопустимым синтаксисом (invalid syntax).

© Habrahabr.ru