Что такое пространство имен PHP?
Что такое Пространства имен?
Ответ Лаймана с примером будет замечательным.
Namespacing делает для функций и классов то, что делает для переменных. Он позволяет использовать одну и ту же функцию или имя класса в разных частях одной и той же программы, не вызывая столкновения имен.
Проще говоря, подумайте о пространстве имен как фамилии человека . Если есть два человека по имени «Джон», вы можете использовать их фамилии, чтобы рассказать им обособленно.
Предположим, вы пишете приложение, которое использует функцию с именем output()
. Функция output()
принимает весь HTML-код на вашей странице и отправляет его пользователю.
Позже ваше приложение становится больше, и вы хотите добавить новые функции. Вы добавляете библиотеку, которая позволяет генерировать RSS-каналы. Эта библиотека также использует функцию с именем output()
для вывода финального фида.
Когда вы вызываете output()
, как PHP знает, использовать ли функцию output()
или функцию output()
библиотеки RSS? Это не так. Если вы не используете пространства имен.
Как мы решаем наличие двух функций output()
? Просто. Мы придерживаемся каждой функции output()
в своем собственном пространстве имен .
Это будет выглядеть примерно так:
namespace MyProject; function output() { # Output HTML page echo 'HTML!'; } namespace RSSLibrary; function output(){ # Output RSS feed echo 'RSS!'; }
Позже, когда мы хотим использовать разные функции, мы будем использовать:
\MyProject\output(); \RSSLibrary\output();
Или мы можем объявить, что мы находимся в одном из пространств имен, и тогда мы можем просто вызвать этот output()
пространства имен output()
:
namespace MyProject; output(); # Output HTML page \RSSLibrary\output();
Если бы у нас не было пространств имен, мы бы (потенциально) меняли много кода в любое время, когда добавляли библиотеку, или придумывали утомительные префиксы, чтобы сделать наши имена функций уникальными. В пространствах имен мы можем избежать головной боли при столкновении имен при смешении стороннего кода с нашими собственными проектами.
Пространство имен позволяет размещать кучу кода под именем и не иметь конфликтов имен с классами, функциями и константами.
Это позволяет вашему коду жить в этом пространстве имен.
PHP использует несколько противоречивый символ \
для отображения уровней пространства имен. Люди встали на руки, потому что они также использовались как спасательный персонаж.
Чтобы использовать пространство имен в PHP, используйте что-то вроде этого в верхней части файла.
namespace my\namespace;
Вы можете найти гораздо больше информации о официальной документации PHP для пространств имен .
Существуют такие методы, как пространства имен в других языках программирования (например, пакеты на Java). Они используются, чтобы иметь несколько классов с тем же именем в проекте.
Из документации php ( http://www.php.net/manual/en/language.namespaces.rationale.php ):
Что такое пространства имен? В самом широком определении пространства имен являются способом инкапсуляции элементов. Во многих местах это можно рассматривать как абстрактную концепцию. Например, в любой операционной системе каталоги служат для группировки связанных файлов и действуют как пространство имен для файлов внутри них. В качестве конкретного примера файл foo.txt может существовать как в каталоге / home / greg, так и в / home / other, но две копии foo.txt не могут сосуществовать в одном каталоге. Кроме того, чтобы получить доступ к файлу foo.txt за пределами каталога / home / greg, мы должны добавить имя каталога к имени файла, используя разделитель каталога, чтобы получить /home/greg/foo.txt. Этот же принцип распространяется на пространства имен в мире программирования.
Пространство имен в основном позволяет помещать код в контейнер. Это предотвратит проблемы с двумя функциями (а также с классами и переменными), которые имеют одно и то же имя.
Они полезны при работе в больших приложениях, чтобы предотвратить проблемы с фрагментами кода, использующими одно и то же имя.
Например, предположим, что нам нужны две функции, называемые «TheMessage». Они оба будут печатать (эхо) разные сообщения каждый. Обычно это приводит к синтаксической ошибке, так как вы не можете иметь две функции, которые имеют одно и то же имя.
Чтобы исправить это, вы можете поместить эти функции в отдельные пространства имен. Это позволит вам использовать обе функции без каких-либо ошибок.
Пространство имен работает как каталог. Вы знаете, как вы можете поместить файлы в каталог с теми же именами, что и файлы в родительском (или любом другом) каталоге? Ну, пространство имен позволяет вам делать это в приложении для переменных, функций и классов.
Некоторое время назад PHP немного изменился для огромных классов статических функций. Единственный способ вызвать любую из этих функций – это префикс вызова с именем класса. Это была примитивная попытка в пространствах имен, но с небольшими преимуществами.
Подобно каталогам и файлам , пространство имен в PHP служит для группировки классов , функций , интерфейсов и констант .
Пример:
Filesystem | PHP Namespace ----------------|------------------ /Dir/File.txt | \Namespace\Class
Он обеспечивает способ переноса элементов из глобального пространства и позволяет использовать имя простого элемента без возникновения конфликта имен в программе. Он поддерживается в PHP 5.3.0, PHP 7.
Но есть некоторые ограничения в аналогии между пространством имен PHP и файловой системой на основе Unix:
| Filesystem | PHP Namespace --------------------------|-----------------------|------------------------- Cas sensitive | No | Yes --------------------------|-----------------------|------------------------- Name with plain number | Yes | No --------------------------|-----------------------|------------------------- Path level | Yes | Yes --------------------------|-----------------------|------------------------- Plain metacharacters name | Yes | No
Этот принцип распространяется на пространство имен в слово программирования.