Прежде чем обсуждать использование пространств имен, важно понять, как PHP узнает, какой элемент пространства имен запрашивает ваш код. Можно провести простую аналогию между пространствами имен PHP и файловой системой. Существует три способа доступа к файлу в файловой системе:

  1. Относительное имя файла, например foo.txt. Это решает, currentdirectory/foo.txtгде currentdirectory - это каталог, занятый в данный момент. Итак, если текущий каталог /home/foo, имя разрешается в /home/foo/foo.txt.
  2. Относительное имя пути, например subdirectory/foo.txt. Это решает currentdirectory/subdirectory/foo.txt.
  3. Абсолютный путь, например /main/foo.txt. Это решает /main/foo.txt.

Тот же принцип можно применить к элементам с именами в PHP. Например, на имя класса можно ссылаться тремя способами:

  1. Неполное имя или имя класса без префикса, например $a = new foo();или foo::staticmethod();. Если текущее пространство имен currentnamespace, это разрешается в currentnamespace\foo. Если код является глобальным кодом без пространства имен, это разрешается в foo. Одно предостережение: неполные имена функций и констант будут разрешаться в глобальные функции и константы, если функция или константа в пространстве имен не определены.
  2. Полное имя или имя класса с префиксом, например $a = new subnamespace\foo();или subnamespace\foo::staticmethod();. Если текущее пространство имен currentnamespace, это разрешается в currentnamespace\subnamespace\foo. Если код является глобальным кодом без пространства имен, это разрешается в subnamespace\foo.
  3. Полное имя или имя с префиксом и глобальным оператором префикса, таким как $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
?>