Я слышал, что последний 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 / функциями / константами и улучшать читаемость кода, избегая появления лишних имен классов.
Пример объявления пространства имен:
<?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
Пространства имен часто используются с библиотеками, способность ссылаться на код библиотеки с одним единственным пространством имен помогает не сжимать другие, которые уже используются.