Основы PHP
Теория: Пространство имен
В этом уроке вы узнаете, что делать при совпадении имен в проекте и как работают пространства имен.
Если мы попытаемся определить две разные функции с одинаковыми именами, то PHP выдаст ошибку во время запуска кода:
А если разнести определения этих функций по разным файлам и включить один в другой? Чуда не произойдет — как только интерпретатор встретит новое определение с уже известным именем, он завершит работу с ошибкой Cannot redeclare — «невозможно переопределить существующую функцию».
Давайте порассуждаем над тем, в чем здесь проблема.
Реальные приложения на PHP состоят из многих тысяч строк кода. Значительная часть этого кода приходит из библиотек, написанных другими людьми. Почти наверняка, мы не знаем, как они там внутри устроены.
Представьте ситуацию: вы используете много библиотек, над проектом работает множество разработчиков, растет объем кода в проекте. Чем больше становится проект, тем выше вероятность столкнуться с повторяющимися названиями.
Усложним ситуацию. Представьте, что вы используете две разные библиотеки с одинаковыми именами функций. Таким образом, вы физически не сможете использовать вместе эти две библиотеки.
Еще включение каждой новой библиотеки в код проекта почти наверняка заставит переименовывать функции самого проекта из-за конфликта имен. Когда-то эта проблема была настолько серьезной, что функции в PHP именовались с префиксами, например:
mylibnameSendEmail()mylibnameAddNewUser()
Таким образом разработчики пытались избежать коллизий — пересечений по именам.
Начиная с версии 5.3, в PHP появился механизм пространств имен. Их задача — изоляция кода разных файлов друг от друга.
Это новый для нас механизм, но сама концепция встречается в нашей жизни повсеместно, например:
- В файловой системе роль пространств имен выполняют директории
- В телефонах — код страны
- В адресах — страны, города и улицы
Последний пример демонстрирует вложенные пространства имен. Недостаточно знать только номер дома, чтобы понять, в какой квартире живет человек. Кроме этого, надо знать улицу, город и страну.
Вложенные пространства имен создают подобную вложенную структуру:
В подавляющем большинстве языков есть встроенные механизмы, аналогичные пространствам имен. Причем в этих языках они существовали с самого начала, а не были добавлены потом. Часто они имеют другие имена — например, модули или пакеты. В каждом языке подобный механизм работает чуть-чуть по-своему, но все они предназначены для разрешения коллизий при именовании.
К сожалению, в силу исторических причин, пространства имен в PHP появились не с самого начала существования языка, как это принято при разработке языков. Из-за этого получилось, два независимых механизма борьбы с коллизиями:
- Включение файлов как таковых
- Пространства имен
Пора переходить к примерам:
Пространство имен задается с помощью ключевого слова namespace, за которым следует имя пространства имен. Теперь посмотрим, как использовать функции, определенные в пространстве имен:
Попытка обратиться к функции по имени приведет к ошибке, так как функция скрыта за пространством имен. Правильный вызов выглядит так:
Рассмотрим еще один пример, когда функция с одним и тем же именем определена в разных пространствах имен:
Два пространства имен имеют одинаковые функции, но это не создает неудобств. Каждая функция вызывается с указанием собственного пространства имен.
Более того, мы можем определить функцию multiply() прямо в том месте, куда производится включение других пространств имен:
Обратите внимание на последний вызов — функции внутри одного пространства имен могут вызывать друг друга напрямую.

