Agreed. Dennis is right on with this. To add on, requiring each file that includes a namespace also defeats the purpose of namespacing. It makes more sense if you have a repository for namespaces and just use those.
Example:
/some/path/to/namespaces/
<?php
use Some::Namespace;
// Test is withing Namespace.
$t = new Test();
// Test2 is not, so it checks includes, etc.
$t = new Test2();
?>
Правила разбора имён
Разбор имён происходит по следующим правилам:
-
Все квалифицированные имена транслируются во время компиляции в
соответствии с текущими импортированными пространствами имён.
К примеру, если импортировано постранство имён 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" из глобального пространства имён
?>
Правила разбора имён
Will
20-Feb-2008 06:08
20-Feb-2008 06:08
