Использование пространства имен: основы
(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
?>