PHP :: Пространства имен
Определение пространства имен
Пространства имен в PHP предназначены для группировки логически связанных классов, интерфейсов, функций и констант, позволяя при этом избегать конфликта имен (т.е. наличия одинаковых идентификаторов) при использовании сторонних фрагментов кода и библиотек или же больших фрагментов своего кода. Кроме того, пространства имен дают воможность применять псевдонимы или сокращения очень длинных имен, что с одной стороны улучшает читабельность кода, а с другой – упрощает задачу разрешения конфликта имен.
Отметим, что в PHP от пространства имен зависят только классы (включая абстрактные, интерфейсы и трейты), функции и константы, хотя при этом внутри пространства имен может находиться любой валидный php-код.
Таким образом, пространству имен в PHP можно дать следующее определение.
Пространство имен (от англ. namespace) – это некоторое абстрактное хранилище или окружение, созданное для логической группировки уникальных идентификаторов (т.е. имен), которые после определения начинают ассоциироваться с этим хранилищем или окружением.
Синтаксис пространства имен,
служебное слово namespace
Для объявления пространства имен используется служебное слово namespace, а все идентификаторы и код, которые нужно ассоциировать с ним, помещаются между соответствующими фигурными скобками {...}. При этом использование вложенных пространств имен не допускается, а файл, содержащий пространство имен, должен содержать его объявление в самом начале перед любым другим кодом, за исключением инструкции declare. Более того, наличие кода вне фигурных скобок также не допускается. Это касается, например, и того же кода HTML вне тегов <?php или ?> (см. пример №1).
<?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(); } //Конец области данного пространства имен //Здесь и после тега '?>' тоже нельзя ничего объявлять //$f=5; ?>
Пример №1. Определение пространства имен в файле PHP
Разрешается использовать синтаксис определения пространства имен и без фигурных скобок, используя после названия пространства имен точку с запятой, как показано в примере №2. Но мы так делать не будем, поскольку данный синтаксис не всегда применим и может приводить к ошибкам. Например, для объединения кода в глобальном пространстве имен (имеется в виду весь код, который был определен вне объявления конкретных пространств имен) с кодом в других пространствах имен, используется только синтаксис со скобками. При этом глобальный код должен быть помещен в конструкцию описания пространства имен, но без указания имени (см. пример №2).
Также допускается комбинирование нескольких пространств имен в одном файле. Но это крайне не рекомендуется, поэтому основным применением данной возможности следует считать объединение нескольких php-файлов в один файл.
<?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. Определение нескольких пространств имен в одном файле