(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
?>