PHP :: Доступ к элементам пространства имен
Так же как файлы и каталоги, пространства имен в PHP могут быть определены с использованием подуровней, например, my_store_1/my_store_2, создавая тем самым иерархию имен. Все это обуславливает и аналогичный принцип обращения к элементам из пространства имен, который позволяет определять требуемый элемент при помощи неполного, полного и абсолютного имени:
- Элементы с неполными именами, т.е не имеющие разделителя пространства имен \, при обращении к ним из текущего пространства имен будут распознаваться интерпретатором с учетом добавления префикса в виде имени текущего пространства и разделителя пространства имен \ перед именем элемента (см. пример №1). Если же код находится в глобальном пространстве, интерпретатор будет искать элементы с исходными именами без добавления к ним каких-либо префиксов.
- Полные имена, т.е. имена, у которых присутствует префикс в виде иерархической структуры, при обращении к ним из текущего пространства имен будут распознаваться интерпретатором с учетом текущей иерархической структуры элемента, в которую будет добавлено имя текущего пространства имен (см. пример №1). При нахождении кода в глобальном пространстве, интерпретатор, опять же, будет искать элементы с исходными префиксами без каких-либо изменений.
- Абсолютные имена, т.е. имена, которые начинаются с префикса глобального пространства \, будут всегда определяться интерпретатором как есть (см. пример №1).
<?php //Объявили пространство имен namespace current_name_space{ //Объявили константу в текущем пространстве имен const my_const = 1; //Обратимся к константе из текущего пространства имен //PHP дополнит неполное имя до полного current_name_space\my_const //выведет 1 echo my_const.'<br>'; //PHP использует полное имя current_name_space\my_const //выведет 1 echo \current_name_space\my_const.'<br>'; //PHP преобразует в current_name_space\current_name_space\my_const //выведет ошибку //echo current_name_space\my_const.'<br>'; } //Объявили подпространство имен namespace current_name_space\myStore{ //Объявили константу в current_name_space\myStore const my_const = 2; //Объявили класс в current_name_space\myStore class my_class{ function my_method(){ echo my_const.'<br>'; } } //Создали объект класса $a=new my_class; //Обратимся к константе и методу из текущего пространства имен //PHP дополнит неполное имя до полного current_name_space\myStore\my_const //выведет 2 echo my_const.'<br>'; //PHP преобразует в полное имя current_name_space\myStore\my_const //выведет 2 echo \current_name_space\myStore\my_const.'<br>'; //PHP просто вызовет метод, т.к. переменные не зависят от пространства имен //выведет 2 $a->my_method(); //вызовет ошибку, т.к. к переменным пространства имен не применяются //\current_name_space\myStore\a->my_method(); } namespace{ //Выведет ошибку, т.к. в глобальном пространстве my_const не определена //echo my_const.'<br>'; //PHP обратится к current_name_space\my_const //выведет 1 echo current_name_space\my_const.'<br>'; //PHP опять обратится к current_name_space\my_const //выведет 1 echo \current_name_space\my_const.'<br>'; //PHP обратится к current_name_space\myStore\my_const //выведет 2 echo current_name_space\myStore\my_const.'<br>'; //PHP опять обратится к current_name_space\myStore\my_const //выведет 2 echo \current_name_space\myStore\my_const.'<br>'; //PHP просто вызовет метод, т.к. переменные не зависят от пространства имен //А вот если бы метод был объявлен статическим, тогда к нему можно было бы //обратиться как current_name_space\myStore\my_class::my_method() $a->my_method();//выведет 2 } ?>
Пример №1. Доступ к элементам пространства имен
Хотелось бы еще раз обратить внимание на то, что от пространства имен зависят только классы, интерфейсы, трейты, функции и константы. Переменные от пространства имен не зависят. Поэтому к ним нужно обращаться по обычным правилам так, как будто пространство имен вообще не было объявлено.
Если нужно обратиться к глобальным классам, функциям или константам изнутри пространства имен, следует использовать абсолютное имя (например, \my_const), состоящее из неполного имени элемента и префикса глобального пространства \, который означает, что это имя должно находиться в глобальном пространстве, даже если обращение идет в контексте определенного пространства имен. Кроме того, если функция или константа не существует в пространстве имен, интерпретатор PHP попытается найти их в глобальном пространстве. Что касается классов, то они всегда преобразуются к текущему имени пространства имен. Поэтому в случае использования неполного имени и отсутствия класса в текущем пространстве имен, интерпретатор не будет делать попытки поиска в глобальном пространстве, а просто выдаст ошибку (см. пример №2).
<?php namespace{ //Объявляем константы в глобальном пространстве const my_const = 'global constant'; const my_const_2 = 'global constant_2'; //Объявляем функцию в глобальном пространстве function global_function(){ echo 'global function'.'<br>'; } //Объявляем класс в глобальном пространстве class global_class{ static function global_method(){ echo 'global method'.'<br>'; } } //Выведет 'global constant' echo my_const.'<br>'; //А вот здесь будет ошибка, т.к. константа еще не определена //echo current_name_space\my_const.'<br>'; //Выведет 'global function' global_function(); //Выведет 'current function' current_name_space\current_function(); //Выведет 'global method' global_class::global_method(); } //Объявили пространство имен namespace current_name_space{ //Объявляем константу в текущем пространстве имен const my_const = 'current_constant'; //PHP обратится к current_name_space\my_const //Выведет 'current_constant' echo my_const.'<br>'; //PHP использует абсолютное имя \my_const //Выведет 'global constant' echo \my_const.'<br>'; //Здесь PHP не найдет константы, поэтому перейдет к глобальному пространству //Выведет 'global constant_2' echo my_const_2.'<br>'; function current_function(){ echo 'current function'.'<br>'; } //Вызываем функцию current_name_space\current_function() //Выведет 'current function' current_function(); //Вызываем глобальную функцию \global_function() //Выведет 'global function' \global_function(); //Имена классов всегда преобразуются к текущему имени пространства имен //Выведет ошибку //global_class::global_method(); //А вот здесь все правильно, PHP воспользуется абсолютным адресом //Выведет 'global method' \global_class::global_method(); } ?>
Пример №2. Переход к элементам глобального пространства
Для явного запроса элемента из текущего пространства имен или подпространства может быть использовано служебное слово namespace, которое по сути представляет собой эквивалент оператора self для классов в пространстве имен (см. пример №3).
<?php namespace{ //Объявляем константу в глобальном пространстве const my_const = 'global constant'; //Объявляем функцию в глобальном пространстве function global_function(){ echo 'global function'.'<br>'; } //Объявляем класс в глобальном пространстве class global_class{ static function global_method(){ echo 'global method'.'<br>'; } } //PHP обратится к \my_const //Выведет 'global constant' echo namespace\my_const.'<br>'; //Вызываем функцию \global_function() //Выведет 'global function' namespace\global_function(); //Выведет 'global method' namespace\global_class::global_method(); } //Объявили пространство имен namespace current_name_space{ //Объявляем константу в текущем пространстве имен const my_const = 'current_constant'; //Объявляем функцию в текущем пространстве имен function current_function(){ echo 'current function'.'<br>'; } //Объявляем класс в текущем пространстве имен class current_class{ static function current_method(){ echo 'current method'.'<br>'; } } //PHP обратится к current_name_space\my_const //Выведет 'current_constant' echo namespace\my_const.'<br>'; //Вызываем функцию current_name_space\current_function() //Выведет 'current function' namespace\current_function(); //Вызываем метод current_name_space\current_method() //Выведет 'current method' namespace\current_class::current_method(); } ?>
Пример №3. Еще одно предназначение служебного слова namespace
Быстрый переход к другим страницам
- Пространства имен в PHP
- Доступ к элементам пространства имен в PHP
- Импорт имени в пространство имен и создание псевдонима имени в PHP
- Вернуться к оглавлению учебника