(PHP 5 >= 5.3.0, PHP 7, PHP 8)
До обсуждения использования пространств имён важно понять, как PHP узнает, какие элементы из пространства имён запрашиваются в вашем коде. Можно провести аналогию между пространствами имён PHP и файловой системой. Есть три способа обратиться к файлу в файловой системе:
foo.txt
, преобразуемое в
currentdirectory/foo.txt
, где currentdirectory
- текущая
директория, в которой мы находимся. Тогда, если текущая директория
/home/foo
, то имя преобразуется в /home/foo/foo.txt
.
subdirectory/foo.txt
, преобразуется
в currentdirectory/subdirectory/foo.txt
.
/main/foo.txt
, которое остаётся
таким же: /main/foo.txt
.
$a = new foo();
или
foo::staticmethod();
. Если текущее пространство имён
currentnamespace
, то эти имена преобразуются в
currentnamespace\foo
. Если код находится в глобальном
пространстве имён, то имена остаются такими же: foo
.
Предупреждение: неполные имена для функций и констант будут определяться
в глобальном пространстве имён, если они не определены в текущем пространстве имён.
Подробнее в Использование пространств
имён: доступ к глобальным функциям и классам.
$a = new subnamespace\foo();
или
subnamespace\foo::staticmethod();
. Если текущее пространство имён
currentnamespace
, то эти имена преобразуются в
currentnamespace\subnamespace\foo
. Если
код находится в глобальном пространстве имён, то имена преобразуются в subnamespace\foo
.
$a = new \currentnamespace\foo();
или
\currentnamespace\foo::staticmethod();
. Имена всегда
определяются так же, как и записаны: currentnamespace\foo
.
Ниже приведён пример трёх вариантов синтаксиса в реальном коде:
file1.php
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
file2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* Неполные имена */
foo(); // определяется как функция Foo\Bar\foo
foo::staticmethod(); // определяется как класс Foo\Bar\foo с методом staticmethod
echo FOO; // определяется как константа Foo\Bar\FOO
/* Полные имена */
subnamespace\foo(); // определяется как функция Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // определяется как класс Foo\Bar\subnamespace\foo
// c методом staticmethod
echo subnamespace\FOO; // определяется как константа Foo\Bar\subnamespace\FOO
/* Абсолютные имена */
\Foo\Bar\foo(); // определяется как функция Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // определяется как класс Foo\Bar\foo с методом staticmethod
echo \Foo\Bar\FOO; // определяется как константа Foo\Bar\FOO
?>
Обратите внимание, что для доступа к любым глобальным
классам, функциям или константам, может использоваться абсолютное имя, такое как
\strlen(), или \Exception, или
\INI_ALL
.
Пример #1 Доступ к глобальным классам, функциям и константам из пространства имён
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // вызывает глобальную функцию strlen
$b = \INI_ALL; // получает доступ к глобальной константе INI_ALL
$c = new \Exception('error'); // Создаёт экземпляр глобального класса Exception
?>