Пространства имён
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