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

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

Это просто способ категоризации переменных / функций?

Пространства имен – это механизм языка программирования для организации переменных, функций и классов. PHP 5.3 добавляет поддержку пространств имен, которые я продемонстрирую в следующем примере:

Предположим, вы хотели бы объединить два проекта, которые используют одно и то же имя класса User , но имеют разные реализации каждого из них:

// Code for Project One (proj1.php) <?php class User { protected $userId; public function getUserId() { return $this->userId; } } $user = new User; echo $user->getUserId(); ?> // Code for Project Two (proj2.php) <?php class User { public $user_id; } $user = new User; echo $user->user_id; ?> <?php // Combine the two projects require 'proj1.php'; require 'proj2.php'; // Naming collision! $myUser = new User; // Which class to use? ?> 

Для версий PHP менее 5.3 вам придется столкнуться с проблемой изменения имени класса для всех экземпляров класса User, используемого одним из проектов, чтобы предотвратить столкновение имен:

 <?php class ProjectOne_User { // ... } $user = new ProjectOne_User; // Code in Project One has to be changed too ?> 

Для версий PHP, больших или равных 5.3, вы можете использовать пространства имен при создании проекта, добавив объявление пространства имен:

 <?php // Code for Project One (proj1.php) namespace ProjectOne; class User { // ... } $user = new User; ?> <?php // Combine the two projects require 'proj1.php'; use ProjectOne as One; // Declare namespace to use require 'proj2.php' // No collision! $user = new \One\User; // State which version of User class to use (using fully qualified namespace) echo $user->user_id; // Use ProjectOne implementation ?> 

Чтобы получить больше информации:

  • Пространства имен PHP.net
  • Пространства имен PHP

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

Вы можете визуализировать пространства имен, поскольку файловая система использует каталоги для группировки связанных файлов.

В основном пространства имен предоставляют вам способ группировки связанных классов, функций и констант.

Они также помогают избежать коллизий имен между вашими классами PHP / функциями / константами и улучшать читаемость кода, избегая появления лишних имен классов.

Пример объявления пространства имен:

 <?php namespace MyProject; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?> 

Пространства имен решают проблему коллизий имен при импорте классов и функций из библиотек.

Без пространств имен, если вы включаете две библиотеки, которые, как оказалось, определяют функцию / класс с тем же именем (т. Е. Две библиотеки, которые включают класс, называемый «пользователь»), он не сработает.

Без поддержки пространства имен в PHP большинство библиотек взяли префикс своих имен функций / классов с чем-то, что может быть уникальным, в попытке избежать столкновений имен. Проблема в том, что это создает более длинные функции или имена классов.

Приведенный здесь пример относится к классу исключений:

 PEAR_Form_Loader_Validate_Table_Element_Validator_Exception. 

Вы можете импортировать из длинного пространства имен в свою собственную локальную область как псевдоним, используя ключевое слово «AS» – имя, которое вы выберете. Таким образом, у вас все еще может быть короткое имя класса по вашему выбору в вашей локальной области.

Следующее применимо к псевдониму под названием DbConnection для Zend :: DB :: Connection.

 use Zend::DB::Connection as DbConnection 

Пространства имен часто используются с библиотеками, способность ссылаться на код библиотеки с одним единственным пространством имен помогает не сжимать другие, которые уже используются.