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