array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ru', ), 'this' => array ( 0 => 'language.namespaces.basics.php', 1 => 'Основы', ), 'up' => array ( 0 => 'language.namespaces.php', 1 => 'Пространства имён', ), 'prev' => array ( 0 => 'language.namespaces.definitionmultiple.php', 1 => 'Несколько пространств имён в одном файле', ), 'next' => array ( 0 => 'language.namespaces.dynamic.php', 1 => 'Пространства имён и динамические особенности языка', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ru', 'path' => 'language/namespaces.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(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
?>