(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Для целей этих правил разрешения приведём важные определения:
Идентификатор без разделителя пространств имён, например Foo
Идентификатор с разделителем пространств имён, например Foo\Bar
Идентификатор с разделителем пространств имён, который начинается с разделителя пространств имён,
например \Foo\Bar. Пространство имён \Foo —
также абсолютное имя.
Идентификатор, который начинается с ключевого слова namespace,
например namespace\Foo\Bar.
Имена разрешаются по следующим правилам:
\A\B разрешается в A\B.
namespace
текущим пространством имён. Префикс namespace\ удаляется,
если имя встречается в глобальном пространстве имён. Например,
имя namespace\A внутри пространства имён X\Y разрешается
в X\Y\A. То же имя в глобальном пространстве имён разрешается
в A.
A\B\C
импортировано как C, то имя C\D\E преобразуется
в A\B\C\D\E.
C\D\E внутри пространства имён A\B
разрешится в A\B\C\D\E.
use A\B\C;, вызов new C()
разрешается в A\B\C(). Аналогично, при
записи use function A\B\foo; вызов foo() разрешается
в A\B\foo.
new C() внутри пространства имён A\B разрешится
в имя A\B\C.
foo()
в коде в пространстве имён A\B:
A\B\foo().
foo()
из глобального пространства имён.
Пример #1 Примеры разрешения имён
<?php
namespace A;
use B\D, C\E as F;
// Вызовы функций
foo(); // Сперва пытается вызвать функцию foo, которую определили в пространстве имён A,
// затем вызывает глобальную функцию foo
\foo(); // Вызывает функцию foo, которую определили в глобальном пространстве
my\foo(); // Вызывает функцию foo, которую определили в пространстве имён A\my
F(); // Сперва пытается вызвать функцию F, которую определили в пространстве имён A,
// затем вызывает глобальную функцию F
// Ссылки на классы
new B(); // Создаёт объект класса B, который определили в пространстве имён A.
// Если класс не найден, то пытается автоматически загрузить класс A\B
new D(); // Следуя правилам импорта, создаёт объект класса D, который определили в пространстве имён B,
// если класс не найден, то пытается автоматически загрузить класс B\D
new F(); // Следуя правилам импорта, создаёт объект класса E, который определили в пространстве имён C,
// если класс не найден, то пытается автоматически загрузить класс класса C\E
new \B(); // Создаёт объект класса B, который определили в глобальном пространстве,
// если класс не найден, то пытается автоматически загрузить класс B
new \D(); // Создаёт объект класса D, который определили в глобальном пространстве,
// если класс не найден, то пытается автоматически загрузить класс D
new \F(); // Создаёт объект класса F, который определили в глобальном пространстве,
// если класс не найден, то пытается автоматически загрузить класс F
// Статические методы и функции пространства имён из другого пространства имён
B\foo(); // Вызывает функцию foo из пространства имён A\B
B::foo(); // Вызывает метод foo из класса B, который определили в пространстве имён A,
// если класс A\B не найден, то пытается автоматически загрузить класс A\B
D::foo(); // Следуя правилам импорта, вызывает метод foo класса D, который определили в пространстве имён B,
// если класс B\D не найден, то пытается автоматически загрузить класс B\D
\B\foo(); // Вызывает функцию foo из пространства имён B
\B::foo(); // Вызывает метод foo класса B из глобального пространства,
// если класс B не найден, то пытается автоматически загрузить класс B
// Статические методы и функции пространства имён из текущего пространства имён
A\B::foo(); // Вызывает метод foo класса B из пространства имён A\A,
// если класс A\A\B не найден, то пытается автоматически загрузить класс A\A\B
\A\B::foo(); // Вызывает метод foo класса B из пространства имён A,
// если класс A\B не найден, то пытается автоматически загрузить класс A\B
?>