Содержание
Без пространства имен
Предположим, в своем файле я не могу создать функцию strlen. Выскочит ошибка, т.к. уже есть такая функция. Или я пишу класс и думаю, а вдруг уже есть такой класс? Значит выскочит ошибка. Или я задаю константу, а вдруг уже есть ранее заданная константа с таким же именем? Неужели каждый раз мне нужно их как-то именовать, например, MY_CONST, My_Class, my_function?
function strlen(){} // Ошибка,т.к. уже есть такая функция function my_strlen(){} class MY_DB{} // А вдруг есть такой класс? define(“E_ALL”, 100); // Ошибка! Уже есть такая константа define(“MY_E_ALL”, 100); my_strlen(); $db = new MY_DB(); echo MY_E_ALL;
Избежать этих проблем позволяет использование пространств имен.
Пространства имен
Использование пространства имен означает, что мы описываем код (можно в отдельном файле, можно в этом же), который принадлежит какому-то одному пространству имен, и имена могут совпадать с другими в коде, но эти имена функций, классов, констант — они будут принадлежать только конкретному пространству имен и не пересекаться ни с какими другими.
Рассмотрим пример:
//задание пространства имен namespace MY_NS //внутри пространтва MY_NS function strlen(){} //внутри MY_NS class DB{} //принадлежит MY_NS const E_ALL = 100; //принадлежит MY_NS //использование пространства имен use MY_NS strlen(); $db = new DB(); echo E_ALL;
Внутри пространства имен MY_NS мы объявили функцию, класс, константу. Теперь для использования их в коде используем соответствующее пространтво имен MY_NS, и внутри него уже вызываем нашу функцию, класс, константу. Т.е. вызовется наша функция strlen (), а не встроенная в php.
Внимание! При определении пространства имен до него не должно ничего быть, никаких переменных, функций или классов. Пространство имен всегда идет первым уровнем, а затем все остальное.
Пространства имен в одном файле
Т.е. можем в одном файле определить несколько пространств имен. См. пример ниже:
//первой пространство имен namespace LIB_STR; function strlen(){} class String{} $a = new String(); //второе пространство имен namespace LIB_ARR; function count(){} class Array{} $b = new Array(); var_dump(get_class($a), get_class($b));
Пространства имен в одном файле с {}
//первое namespace LIB_STR{ function strlen(){} class String{} $a = new String(); } //второе namespace LIB_ARR{ function count(){} class Array{} $b = new Array(); } //обращение к функции из конкретного пространства имен namespace{ LIB_STR\strlen(); }
Иерархия пространств имен
namespace LIB_STR; function strlen($str) { return \strlen($str) * 2;} echo strlen("test"); // 8, т.е. обратились к стандартной функции вне пространства имен echo \strlen("test"); // 4, т.е. функция из нашего пространства имен echo \LIB_STR\strlen("test"); // 8, функция из пространства имен
В этом примере мы обращаемся просто к стандартной встроенной функции php и к функции из нашего пространства имен.
Пространства имен и __autoload ()
//отдельный файл lib.php, в нем создаем объект namespace LIB;$foo = new Foo(); //наш файл function __autoload($class) { var_dump($class);} //LIB\Foo include "lib.php";
Имя класса передается вместе с именем пространства.
Функция __autoload (), декларированная в пространстве имен, не вызывается!
Псевдоконстанта и псевдоним
В пространстве имен появилась своя псевдоконстанта с двойным подчеркиванием.
У нас есть пространство имен. Как узнать имя текущего пространства:
namespace My\Lib\For\Some\Ns; // имя текущего пространства __NAMESPACE__; class Foo{} get_class(new Foo()); // My\Lib\For\Some\Ns\Foo // Псевдоним для класса Foo use My\Lib\For\Some\Ns\Foo AS Bar; //т.е. BAR заменяет собой весь длинный путь