namespace

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

Без пространства имен

Предположим, в своем файле я не могу создать функцию 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 заменяет собой весь длинный путь



Добавить комментарий

Ваш e-mail не будет опубликован.