(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(); // Разрешается в метод staticmethod класса Foo\Bar\foo
echo FOO; // Разрешается в константу Foo\Bar\FOO
subnamespace\foo(); // Разрешается в функцию Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // Разрешается в метод staticmethod класса Foo\Bar\subnamespace\foo
echo subnamespace\FOO; // Разрешается в константу Foo\Bar\subnamespace\FOO
\Foo\Bar\foo(); // Разрешается в функцию Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // Разрешается в метод staticmethod класса Foo\Bar\foo
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
?>