Прежде чем обсуждать использование пространств имен, важно понять, как 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
.
Тот же принцип можно применить к элементам с именами в PHP. Например, на имя класса можно ссылаться тремя способами:
- Неполное имя или имя класса без префикса, например
$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() {}
}
/* Unqualified name */
foo(); // resolves to function Foo\Bar\foo
foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO
/* Qualified name */
subnamespace\foo(); // resolves to function Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // resolves to class Foo\Bar\subnamespace\foo,
// method staticmethod
echo subnamespace\FOO; // resolves to constant Foo\Bar\subnamespace\FOO
/* Fully qualified name */
\Foo\Bar\foo(); // resolves to function Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo \Foo\Bar\FOO; // resolves to constant Foo\Bar\FOO
?>
Обратите внимание, что для доступа к любому глобальному классу, функции или константе можно использовать полное имя, например \strlen() или \Exception или \INI_ALL
.
Пример #1 Доступ к глобальным классам, функциям и константам из пространства имен
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // calls global function strlen
$b = \INI_ALL; // accesses global constant INI_ALL
$c = new \Exception('error'); // instantiates global class Exception
?>
0 комментариев