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

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

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

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

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

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

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

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

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

<?php
//const my_const = 1;   //Здесь объявлять ничего нельзя и перед тегом '<?php' тоже 
declare(strict_types=1);//Использовать инструкцию declare разрешается

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

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

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

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

echo my_const.'<br>';   //Выведет 1
$b= new my_class;
echo $b->a.'<br>';      //Выведет 2
my_function();          //Выведет 3
}                       //Конец области данного пространства имен

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

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

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

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

<?php

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

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

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

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

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

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

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

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