Пространства имён
Исключения
Пространства имён
PHP Manual

## Правила разбора имён

Разбор имён происходит по следующим правилам:

1. Все квалифицированные имена транслируются во время компиляции в соответствии с текущими импортированными пространствами имён. К примеру, если импортировано постранство имён A::B::C, вызов `C::D::e()` будет транслирован как `A::B::C::D::e()`.
2. Неквалифицированные имена классов транслируются во время компиляции в соответствии с текущими импортированными пространствами имён (полные имена заменяют короткие импортированные имена). К примеру, если пространство имён A::B::C импортировано, `new C()` будет транслировано как `new A::B::C()`.
3. Внутри пространства имён вызов неквалифицированных функций, определенных в этом же пространстве имён интерпертируется как вызов в данном пространстве имён во время компиляции.
4. Внутри пространства имён (например A::B) вызов неквалифицированных функций, не определенных в этом пространстве имён будет разрешаться во время выполнения. Вызов функции foo() будет разрешаться следующим образом:
   1. Поиск в текущем пространстве имён: A::B::foo().
   2. Поиск внутренней PHP функции foo().
   В случае неудачи всех предыдущих попыток будет использован вызов определенной в глобальном пространстве имён функции ::foo().
5. Внутри пространства имён (например A::B), вызов неквалифицированных классов разрешается во время выполнения. Например вызов `new C()` будет разрешаться следующим образом:
   1. Поиск класса в текущем пространстве имён: A::B::C.
   2. Попытка вызова внутреннего PHP-класса C.
   3. Попытка автозагрузки A::B::C.
   В случае неудачи всех предыдущих, будет использован вызов `new ::C()`.
6. Вызов квалифицированных функций разрешается во время выполнения. Например вызов A::B::foo() будет разрешаться следующим образом :
   1. Поиск функции foo() в пространстве имён A::B.
   2. Поиск класса A::B и вызов его статического метода foo(). Будет сделана автозагрузка класса, если необходимо.
7. Квалифицированные имена классов разрешаются во время компиляции, как классы соответствующего пространства имён. К примеру `new A::B::C()` будет ссылаться на класс C пространства имён A::B.

Пример #1 Примеры разбора имён

`<?php
namespace A;
// вызовы функций
foo(); // сначала попытка вызвать "foo" определенную в пространстве имён "A"
// затем вызов внутренней функции "foo"
::foo(); // вызоы функции "foo" определенной глобально
// class references
new B(); // сначала попытка создать объект класса "B" определенного в пространстве имён "A"
// затем создание объекта внутреннего класса "B"
new ::B(); // создать объект класса "B" определенного глобально
// статические методы/функции пространства имён из других (не текущих) пространств имён
B::foo(); // сначала попытка вызвать функцию "foo" из пространства имён "A::B"
// затем вызов метода "foo" внутреннего класса "B"
::B::foo(); // сначала попытка вызова функции "foo" из пространства имён "B"
// затем вызов метода "foo" класса "B" из глобального пространства имён
// статические методы/функции пространства имён из текущего пространства имён
A::foo(); // сначала попытка вызова функции "foo" пространства имён "A::A"
// затем попытка вызова метода "foo" класса "A" из пространства имён "A"
// затем попытка вызова функции "foo" пространства имён "A"
// затем вызов метода "foo" внутреннего класса "A"
::A::foo(); // сначала попытка вызова функции "foo" пространства имён "A"
// затем вызов метода "foo" класса "A" из глобального пространства имён
?>`

Пространства имён
Исключения
Пространства имён
PHP Manual