html.okpython.net
HTML и CSS для начинающих

PHP :: Доступ к элементам пространства имен

Так же как файлы и каталоги, пространства имен в PHP могут быть определены с использованием подуровней, например, my_store_1/my_store_2, создавая тем самым иерархию имен. Все это обуславливает и аналогичный принцип обращения к элементам из пространства имен, который позволяет определять требуемый элемент при помощи неполного, полного и абсолютного имени:

  • Элементы с неполными именами, т.е не имеющие разделителя пространства имен \, при обращении к ним из текущего пространства имен будут распознаваться интерпретатором с учетом добавления префикса в виде имени текущего пространства и разделителя пространства имен \ перед именем элемента (см. пример №1). Если же код находится в глобальном пространстве, интерпретатор будет искать элементы с исходными именами без добавления к ним каких-либо префиксов.
  • Полные имена, т.е. имена, у которых присутствует префикс в виде иерархической структуры, при обращении к ним из текущего пространства имен будут распознаваться интерпретатором с учетом текущей иерархической структуры элемента, в которую будет добавлено имя текущего пространства имен (см. пример №1). При нахождении кода в глобальном пространстве, интерпретатор, опять же, будет искать элементы с исходными префиксами без каких-либо изменений.
  • Абсолютные имена, т.е. имена, которые начинаются с префикса глобального пространства \, будут всегда определяться интерпретатором как есть (см. пример №1).
PHP Результат htmlCodes
<?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 Результат htmlCodes
<?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 Результат htmlCodes
<?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

Быстрый переход к другим страницам