Что такое пространства имен?

Что такое пространство имен 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 

Этот принцип распространяется на пространство имен в слово программирования.