Определение пространства имен в PHP
http://belarusweb.net
Основы создания сайтов

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

Определение пространства имен

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

Отметим, что в PHP от пространства имен зависят только классы (включая абстрактные, интерфейсы и трейты), функции и константы, хотя при этом внутри пространства имен может находиться любой валидный php-код.

Таким образом, пространству имен в PHP можно дать следующее определение.

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

Синтаксис пространства имен,
служебное слово namespace

Для объявления пространства имен используется служебное слово namespace, а все идентификаторы и код, которые нужно ассоциировать с ним, помещаются между соответствующими фигурными скобками '{...}'. При этом использование вложенных пространств имен не допускается, а файл, содержащий пространство имен, должен содержать его объявление в самом начале перед любым другим кодом, за исключением инструкции declare. Более того, наличие кода вне фигурных скобок также не допускается. Это касается, например, и того же кода HTML вне тегов '<?php' или '?>' (см. пример №1).

PHP Результат BwCodes
<?php

//Здесь объявлять ничего нельзя и перед тегом '<?php' тоже 
//const my_const = 1;   

//Использовать инструкцию declare разрешается
declare(strict_types=1);

//Объявили пространство имен
namespace myStore{      

	//Объявили константу в пространстве имен myStore
	const my_const = 1;     

	//Объявили класс в пространстве имен myStore
	class my_class{        
		public $a=2;
	}

	//Объявили функцию в пространстве имен myStore
	function my_function(){ 
		echo 3;
	}

	//Выведет 1
	echo my_const.'<br>';   

	$b = new my_class;
	//Выведет 2
	echo $b->a.'<br>';      
	//Выведет 3
	my_function();          

} //Конец области данного пространства имен

//Здесь и после тега '?&gt;' тоже нельзя ничего объявлять 
//$f=5; 
                
?>

Пример №1. Определение пространства имен в файле PHP

Разрешается использовать синтаксис определения пространства имен и без фигурных скобок, используя после названия пространства имен точку с запятой, как показано в примере №2. Но мы так делать не будем, поскольку данный синтаксис не всегда применим и может приводить к ошибкам. Например, для объединения кода в глобальном пространстве имен (имеется в виду весь код, который был определен вне объявления конкретных пространств имен) с кодом в других пространствах имен, используется только синтаксис со скобками. При этом глобальный код должен быть помещен в конструкцию описания пространства имен, но без указания имени (см. пример №2).

Также допускается комбинирование нескольких пространств имен в одном файле. Но это крайне не рекомендуется, поэтому основным применением данной возможности следует считать объединение нескольких php-файлов в один файл.

PHP Результат BwCodes
<?php

//----------------- Использование синтаксиса без скобок -------------------

/* 

//Так объявлять мы не будем
namespace myStore_1;
	//Объявили константу в пространстве имен myStore_1
	const my_const = 1;  
	//Выведет 1
	echo my_const.'<br>';

//Объявили второе пространство имен
namespace myStore_2;   
	//Объявили константу в пространстве имен myStore_2
	const my_const = 2;  
	//Выведет 2
	echo my_const.'<br>'; 
	
*/

//-----------------------------------------------------------------------	

//Объявили первое пространство имен
namespace myStore_1{   
	//Объявили константу в пространстве имен myStore_1
	const my_const = 1;  
	//Выведет 1
	echo my_const.'<br>';
}

//Объявили второе пространство имен
namespace myStore_2{   
	//Объявили константу в пространстве имен myStore_2
	const my_const = 2;  
	//Выведет 2
	echo my_const.'<br>';
}

//Глобальный код определяем в глобальное пространство имен
namespace {            
	$b='global code';
	//Выведет global code
	echo $b.'<br>';      
}

?>

Пример №2. Определение нескольких пространств имен в одном файле

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