belarusweb.net
© Петр Романовский Минск, 2016-2017.



belarusweb.net

Основы создания сайтов...
PHP+MySQL >>>
                          Учебник Задачник Справочник

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

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

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

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

Пространство имен (от англ. 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. Определение нескольких пространств имен в одном файле

Контрольные вопросы и задания

  1. Дайте определение пространству имен.
  2. Опишите синтаксис объявления пространства имен. Разрешается ли создавать
    вложенные пространства имен?
  3. Как объединить код в глобальном пространстве с кодом объявленного пространства имен?
  4. Можно ли создать несколько пространств имен в одном файле?

Словарь новых английских слов

namespace [neɪmˈspeɪs] – пространство имен.
declare [dɪˈklɛː] – объявлять, провозглашать.
storage [ˈstɔːrədʒ] – хранилище, склад, память.
current [ˈkʌr(ə)nt] – текущий.
Комментарии (0)
Петр Романовский
1. Приветствуются комментарии, которые содержат дополнения к материалу текущей страницы, а также ваши ответы на вопросы других пользователей.
2. Если вам что-то непонятно - спрашивайте, не забывая написать, что именно и с какого места.
Показаны все комментарии
Чтобы оставить свой комментарий, авторизуйтесь, пожалуйста!    
     
belarusweb.net © Петр Романовский, Минск, 2016-2017.
Связаться с автором
Наверх