Документация PHP
| Документация DHTML | Документация Smarty | SVG/VML Графика и JavaScript
| Документация bash |
Правила разбора имён
Разбор имён происходит по следующим правилам:
-
Все квалифицированные имена транслируются во время компиляции в
соответствии с текущими импортированными пространствами имён.
К примеру, если импортировано постранство имён A::B::C, вызов
C::D::e()
будет транслирован какA::B::C::D::e()
. -
Неквалифицированные имена классов транслируются во время компиляции
в соответствии с текущими импортированными пространствами имён
(полные имена заменяют короткие импортированные имена). К примеру,
если пространство имён A::B::C импортировано,
new C()
будет транслировано какnew A::B::C()
. - Внутри пространства имён вызов неквалифицированных функций, определенных в этом же пространстве имён интерпертируется как вызов в данном пространстве имён во время компиляции.
-
Внутри пространства имён (например A::B) вызов
неквалифицированных функций, не определенных в этом пространстве имён
будет разрешаться во время выполнения.
Вызов функции foo() будет разрешаться следующим образом:
- Поиск в текущем пространстве имён: A::B::foo().
- Поиск внутренней PHP функции foo().
-
Внутри пространства имён (например A::B), вызов
неквалифицированных классов разрешается во время выполнения. Например
вызов
new C()
будет разрешаться следующим образом:- Поиск класса в текущем пространстве имён: A::B::C.
- Попытка вызова внутреннего PHP-класса C.
- Попытка автозагрузки A::B::C.
new ::C()
. -
Вызов квалифицированных функций разрешается во время выполнения.
Например вызов A::B::foo() будет разрешаться следующим образом :
- Поиск функции foo() в пространстве имён A::B.
- Поиск класса A::B и вызов его статического метода foo(). Будет сделана автозагрузка класса, если необходимо.
-
Квалифицированные имена классов разрешаются во время компиляции, как
классы соответствующего пространства имён. К примеру
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" из глобального пространства имён
?>