Александр Майоров
Пространства имен, появившиеся в PHP относительно недавно, предназначены
для локализации имен идентификаторов и предотвращения их конфликтов. Сегодня
подробно рассмотрим способы применения пространств имен и их особенности в
языке PHP.
Что такое namespace?
Пространство имён (namespace) – это область определения переменных, констант
и т. п., ограничивающая их область видимости. Оно предназначено для локализации
имен идентификаторов и предотвращения конфликтов между ними. Элементы,
объявленные в одном пространстве, отделены от элементов, принадлежащих другому
пространству.
Немного уйдем от PHP к С++ и посмотрим на
примерах, что из себя представляют пространства имен, так как в этом языке они
появились относительно давно.
Среда программирования С++ наполнена большим
количеством переменных, функций и классов. Раньше все их имена пребывали в
одном глобальном пространстве и нередко конфликтовали между собой.
Например, если в программе определена функция
atoi(), она может замещать собой стандартную функцию atoi(), поскольку имена
обеих функций находятся в одном глобальном пространстве имен.
Чаще всего конфликты имен возникали, когда в
одной программе использовались несколько сторонних библиотек одновременно,
написанных разными программистами. Особенно это касается имен классов.
Например, если в программе определен класс MergeInstance, а в библиотеке,
которую использует эта программа, имя уже было задействовано, возникал
конфликт.
Было решено разделять идентификаторы по пространству
имен, и ввели ключевое слово namespace. Введение namespace позволило решать эти
проблемы. Поскольку пространство имен позволяет локализовать область видимости
объектов, объявленных внутри него, одно и то же имя, упомянутое в разных
контекстах, больше не вызывало конфликтов. Теперь стандартная библиотека
определена внутри своего собственного пространства имен std, что намного
уменьшает вероятность конфликтов. Программист может самостоятельно создавать
свои собственные пространства имен и локализовать имена, которые могут вызывать
конфликты. Это особенно важно при разработке классов и библиотек функций.