Пространства от имена
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. Прави се опит да се намери и извика вградената функция foo().
    За извикване на потребителска функция в глобалното пространство се използва ::foo().
  5. В тялото на пространство от имена (примерно A::B), обръщенията към неопределени имена на класове се определят по време на изпълнение. Ето как се определя извикване към new C():
    1. Търси клас от текущото пространство от имена: A::B::C.
    2. Прави опит да намери и извика вградения клас 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.

Example #1 Примери за определянето на имена

<?php
namespace A
;

// извиквания на функции

foo();      // първо се прави опит за извикване на "foo", дефинирана в пространството от имена "A"
            // след това извиква вътрешната функция "foo"

::foo();    // извиква функция "foo", дефинирана в глобалната област на действие

// референции към класове

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