#9.2 php Использование пространств имен. Абсолютные и относительные имена

Квалифицированное имя элемента (функции, класса и т.д) пространства имен состоит из префикса, определяющего пространство имен, слеша (\) и имени элемента:

namespace\element_name

Для обращения к любым элементам некоторого пространства имен всегда может использоваться его квалифицированное имя, начинающееся с ведущего слеша (\). Такое имя называется абсолютным. Например, абсолютное имя функции speak() пространства cat:

\cat\speak();

В зависимости от того, где происходит обращение к элементу пространства имен, по аналогии с файловой системой, допустимо использовать абсолютные или относительные (полные и неполные) имена. Возможны следующие варианты:

  1. Обращение к элементу некоторого пространства имен внутри этого пространства.
  2. Обращение к элементу некоторого пространства имен из глобального пространства имен.
  3. Обращение к элеменету некоторого пространства имен из другого пользовательского пространства имен.
  4. Обращение к глобальному пространству имен внутри пользовательского.

В втором и третьем случаях необходимо предварительно подключить файл с описанием нужного пространства имен:

<?php
include "myNamespace.php";

1 случай. Обращение к элементу пространства имен из этого же пространства

В этом случае может использоваться неполное относительное имя, то есть имя функции, класса, интерфейса или константы без префикса. В следующем примере неполное имя функции title() PHP автоматически преобразует к квалифицированному имени myNamespace\title().

<?php
namespace myNamespace;

function title()
{
    echo "Пространство имен «myNamespace»";
}

title();

Кроме того, для ссылки на текущее пространство можно использовать ключевое слово namespace:

<?php
namespace myNamespace;

function title()
{
    echo "Пространство имен «myNamespace»";
}

namespace\title();

2 случай. Обращение к элементу пространства имен из глобального пространства имен

При обращении из глобального пространства имен может использоваться полное относительное имя элемента — его квалифицированное имя без ведущего слеша, но с указанием префикса, означающего пространство имен. Например,

<?php
include "myNamespace.php";

myNamespace\title();

3 случай. Обращение к элементу пространства имен из другого пользовательского пространства имен

При обращении из пространства имен currentnamespace относительное имя myNamespace\title() будет автоматически преобразовано к виду currentnamespace\myNamespace\title() (подробнее о вложенных пространствах имен написано в следующем разделе). Поэтому, если myNamespace не является вложенным по отношению к текущему пространству имен, необходимо использовать абсолютное имя (с ведущим слешем) для доступа к его элементам:

<?php
namespace currentnamespace;

include "myNamespace.php";

\myNamespace\title();

Замечание:

Если для доступа к элементу пространства имен используются динамические имена (переменные, содержащие имена переменных), автоматического преобразования имени не происходит. В этом случае ведущий слеш можно не писать:

<?php
namespace currentnamespace;

include "myNamespace.php";

$title = 'myNamespace\title';

$title();

4 случай. Обращение к глобальному пространству имен из пользовательского

Используются абсолютные имена (с ведущим слешем) стандартных констант, функций и классов. Например,

<?php
namespace myNamespace;

echo \min(1, 2, 3);

Кроме того, для обращения к встроенным функциям и константам, если они не переопределялись в текущем пространстве, допустимо использование относительных имен:

<?php
namespace myNamespace;

echo min(1, 2, 3);

Однако это неверно для глобальных классов. Например, следующий код приведет к ошибке:

<?php
namespace myNamespace;

$obj1 = new \Exception(); //корректное обращение к глобальному классу Exception
$obj2 = new Exception(); //ошибка — класс Exception не определен в пространстве имен myNamespace