Exemple de utilizare a spațiului de nume în php. Spații de nume în PHP, explicat. Spații de nume: mai multe domenii de descriere

Mi-am încapsulat recent proiectul într-un spațiu de nume și am întâlnit problema lipsei de documentație adecvată. Tot ceea ce am reușit să găsim datează din aproximativ 2009 și este aproape 2012... În materialul găsit, există o mulțime de locuri nefuncționale care folosesc ceva care nu este în versiunea actuală de php. În acest sens, aș dori să fac un pic de lumină asupra acestei probleme.
Deci, ce este un spațiu de nume sau un spațiu de nume? Marea wikipedia le definește astfel:

Spațiul de nume este un set, ceea ce înseamnă un model, un spațiu de stocare abstract sau un mediu creat pentru gruparea logică a identificatorilor unici (adică nume). Un identificator definit într-un spațiu de nume este asociat cu acel spațiu de nume. Același identificator poate fi definit independent în mai multe spații. Astfel, o valoare asociată cu un identificator definit într-un spațiu de nume poate (sau nu) să aibă același sens (sau mai degrabă diferit) ca același identificator definit într-un alt spațiu de nume. Limbile care știe spațiul de nume definesc reguli care indică spațiului de nume căruia îi aparține un identificator (adică definiția acestuia).wiki

Tot clar? Este de fapt simplu. Înainte de versiunea 5.3, în php existau doar două spații - global (în care era executat codul principal) și local (în care erau definite variabilele funcției).

De la versiunea 5.3 totul s-a schimbat. Acum vă puteți defini spațiul de nume în care vor exista clasele, metodele etc.


Sper că a devenit puțin mai clar.

Am numit în mod special clasele la fel. Deoarece sunt definite în spații diferite, sunt două clase diferite, în ciuda acelorași nume. Scriptul principal încă funcționează în spațiul global, nimic nu s-a schimbat aici și clasele și funcțiile pot fi încă definite în el. Atunci pentru ce sunt spațiile? În primul rând, pentru a vă asigura că atunci când includeți un fișier cu un cadru sau bibliotecă, clasele dvs. nu vor suprascrie clasele cadrului sau invers.

Pentru a utiliza clasele definite în spațiul dvs. de nume, trebuie să importați spațiul definit în cel global în locul potrivit (de obicei prefer să fac acest lucru la începutul fișierului). Pentru a face acest lucru, utilizați cuvântul cheie use

Atenţie: din anumite motive php nu permite utilizarea cuvântului cheie utilizareîn stare blocuri și bucle

Să luăm exemplul din imagini și să îl implementăm în cod:

Atenţie: cuvântul cheie namespace trebuie să fie situat chiar la începutul fișierului, imediat după
fisierul A.php
Fișierul B.php
Este posibilă o sintaxă alternativă:
Este recomandat să declarați fiecare spațiu de nume într-un fișier separat. Deși se poate într-unul, nu este strict recomandat!
Acum să trecem la al treilea fișier, în care va funcționa scriptul nostru principal
index.php
S-ar părea că acesta este un avantaj, se adaugă doar mai mult cod, dar acest lucru nu este în întregime adevărat, puțin mai departe voi da un exemplu de clasă de încărcare automată, cu care liniile care conectează fișierele cu clase vor fi inutile.
Acum să ne uităm la cursurile noastre.

Atenţie: folosind operatorul de rezoluție a domeniului (::) în spațiile de nume php nepermis! Singurul lucru pentru care este potrivit este accesarea metodelor și constantelor clasei statice. La început au vrut să-l folosească pentru spațiul de nume, dar apoi s-au decis să nu-l facă din cauza problemelor apărute. Prin urmare, o construcție ca A::A::say(); este invalid și va avea ca rezultat o eroare.

Pentru spațiile de nume trebuie să utilizați caracterul bară oblică inversă „\”
Atenţie: Pentru a evita neînțelegerile, este necesar să evadați acest caracter atunci când este folosit în șiruri de caractere: „\\”

Spațiile de nume pot fi imbricate unul în celălalt, să adăugăm fișierului nostru A.php:
iar în index vom scrie următoarele:

Un punct important este utilizarea alias-urilor pentru spațiile importate. Ai putea scrie A\subA::say(); Veți fi de acord că este dificil să scrieți căi complete către spații de fiecare dată; pentru a evita acest lucru, au fost introduse aliasuri. La compilare se va întâmpla următoarele: în loc de sub alias, va fi înlocuit A\subA, deci vom obține apelul A\subA::say();

Ce se întâmplă atunci când apelăm funcții definite în spațiul global? PHP caută mai întâi o funcție în spațiul în care lucrați în prezent și, dacă nu o găsește, trece în domeniul global. Pentru a indica imediat că utilizați o funcție globală, trebuie să o precedați cu o bară oblică inversă.

Pentru a evita problemele cu încărcarea automată a claselor din spații, sistemul de fișiere trebuie să fie organizat similar cu organizarea spațiilor. De exemplu, avem un folder rădăcină clase, unde vor fi stocate clasele noastre, apoi spațiile noastre pot fi organizate după cum urmează
clase\A\A.php
clase\A\sub\A.php (subspațiul va fi plasat într-un fișier separat)
clase\B\B.php

PHP are o constantă magică __NAMESPACE__ care conține numele spațiului curent.

Și acum despre încărcarea automată.

Clasa de mai jos nu este a mea, doar am făcut-o să funcționeze și am îmbunătățit-o puțin, luată de aici.
Atenţie: Pentru ca clasele dvs. să fie încărcate, numele clasei trebuie să se potrivească cu numele fișierului!

" .$fișier ."în " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("conectat " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closedir($handle); ) ) funcție statică privată StPutFile($date) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $fișier = fopen($dir, "a"); flock($fișier, LOCK_EX); fwrite($fișier, ("║" .$date ."=>" .date(" d.m.Y H:i:s")."

" .PHP_EOL)); flock($fișier, LOCK_UN); fclose ($fișier); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Dacă vă uitați la numele claselor care vin pentru încărcare, veți vedea că fiecare clasă este precedată de un prefix din spațiul de nume care este specificat în utilizare. Acesta este motivul pentru care vă recomand să folosiți locația fișierelor în directoare similare cu spațiul de nume; acest lucru accelerează căutarea la una sau două iterații.

Acum indexul nostru poate fi scris astfel:
Acum toate clasele și interfețele pe care le veți folosi vor fi încărcate automat.

Pentru a demonstra unele dintre capacitățile dinamice ale limbajului cu spații, să declarăm o altă clasă:
test.php

Index.php
sayName("test"); //sau puteți face acest test\sayName("test2"); //sau ca asta $obj::sayName("test"); //sau puteți face acest test::sayName("test2");

Sper că articolul meu va fi de folos cuiva.

PHP, începând cu versiunea 5.3, ne-a oferit spații de nume. De atunci, a existat o discuție lentă și aprinsă despre cum să folosiți acest spațiu de nume?
Unele cadre, cum ar fi Symphony, Laravel și, desigur, Zend, au adoptat această tehnologie.
Toate acestea se încadrează mai mult sau mai puțin în schema MVC. Rămâne o dezbatere, probabil eternă: care ar trebui să fie principala pereche de căsătorie a aplicației - Model și Controller?
Unii ne spun că Modelul ar trebui să fie robust și gras și cu ea un Controller zvelt și subțire. Într-un cuvânt - matriarhatul.
Alții, dimpotrivă, cred că Controlorul trebuie să gestioneze și să comandă totul, așa că se dovedește solid și bine hrănit. Și cu el este un Model subțire, zvelt, a cărui sarcină se rezumă să dea și să aducă. Acesta este patriarhia.
Deci care este mai bun în schema MVC? Patriarhat sau matriarhat?
Să privim asta din perspectiva construirii unei unități familiale bazate pe democrație. Și lăsați Namespace să ne ajute cu asta.

Nu ne plac controlerele groase și neplăcute care, ca un taur într-un magazin de porțelan, pot zdrobi întreaga aplicație dacă ești neglijent.
Nici modelele grase nu ne plac. Ei bine, cui îi plac? Trebuie să fie demni de podium!
Să încercăm, cu ajutorul Namespace, ca și cu un bun matchmaker, să creăm o familie armonioasă.

Mai întâi, să creăm cadrul aplicației. Oricât de banal ar fi, să fie un blog.

Am creat o structură de bază în care:

  • Blogul este stocarea aplicației noastre;
  • Vizualizări și șabloane - stocarea vizualizărilor și a șabloanelor;
  • Utility - depozit de biblioteci partajate;
  • index.php - script bootstrap;
  • Post - aici ar trebui să aibă loc idila familială a Controllerului și Modelului.

Cu index.php totul este simplu:

alerga(); /* * sfârșitul index.php */

Determinăm căile necesare și creăm un autoloader.
Încărcătorul automat încarcă clasele necesare, care sunt situate într-o ierarhie de foldere în funcție de spațiul de nume de clasă. De exemplu, clasa BlogPostServicesView ar fi căutată în Blog/Post/Services.
Și iată prima întâlnire cu Namespace.
Când pornim index.php, creăm o instanță a aplicației Blog, a cărei clasă este încărcată de pe Blog/Blog.php.
Să ne uităm la el.

post = post nou(); ) funcția publică run() ( $this->post->view->all(); ) )//end class Blog

Când creăm clasa Blog, injectăm o clasă Post în ea cu Namespace BlogPost și încărcătorul automat o încarcă din Blog/Post/Post.php.
Probabil această clasă poate fi numită Controller,

vizualizare = new View(); ) )//termină clasa Post

Entitatea Post include:
- structura înregistrării de date în sine - BlogPostEntitiesPostEntity.php

Servicii care deservesc solicitările Controllerului - BlogPostServicesView.php (unul dintre servicii, de exemplu)

db = nou DB(); )//end __construct public function all() ( $posts = $this->db->survey(); Contemplate::compose(array("header" => "header", "main" => "main", "footer" => "footer",), array("posts" => $posts, "title" => "Viper site",)); ) )//termină clasa PostView

Sistemul de interacțiune cu bazele de date - BlogPostRepositoriesDB.php - iată, modelul nostru subțire, elegant,
Doar dă-l, adu-l și nimic mai mult!

dbh = PDO nou ("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => true)); ) catch (PDOException $e) ( echo "Eroare!: " . $e->getMessage() ."
"; die(); ) )//end __construct public function survey() ( $query_view = $this->dbh->prepare("SELECT * din postari"); $query_view->execute(); return $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//termină sondaj )//termină clasa Db

Drept urmare, am reușit să creăm o structură de aplicație în care toate componentele sunt bine conectate, în timp ce am realizat o separare clară a claselor, în care fiecare clasă își îndeplinește propria sarcină. Controlerul nostru este subțire și în același timp puternic. Modelul se potrivește cu el. Familia perfectă!
Și totul datorită Namespace.

Nu argumentez, în multe cazuri cadrul este convenabil. Dar uite, Namespace nu îți amintește de nimic?
O împărțire clară în clase, o ierarhie strictă și în același timp flexibilă a directoarelor și claselor, complet subordonată dezvoltatorului.
Uneori, nu există un astfel de add-on semnificativ sub formă de sute de fișiere și clase sub forma unui cadru.
Absența unui pat procustean de reguli pentru interacțiunea claselor și componentelor.

Articolul a fost inspirat de gândurile pe această temă ale lui Taylor Otwell, autorul framework-ului Laravel, pentru care îi mulțumesc mult.
Adresa exemplului de cod sursă pe GitHub.

Buna ziua. În articolul de astăzi ne vom uita la, ce sunt spațiile de nume în PHP.

Dacă îl folosești de mult timp OOP, atunci probabil că ați întâlnit o situație în care, la conectarea unei biblioteci terță parte, ați întâmpinat un eșec din cauza faptului că utilizați deja aceleași nume de clasă în cod ca și în bibliotecă. Acest lucru se poate întâmpla mai ales dacă folosiți nume comune precum "model", "db"și așa mai departe. Vă voi spune acum cum să remediați acest lucru.

Spațiu de nume- acesta este un fel de stocare creat pentru gruparea abstractă a identificatorilor unici (nume).

Acestea. daca folosesti spații de nume, atunci puteți conecta în siguranță biblioteci terțe și să nu vă fie teamă că vor avea aceleași nume ca în codul dvs. Să terminăm cu teoria și să trecem la practică.

Să creăm un fișier clasa mea.php cu acest continut

namespace my\oneProject;
clasa MyClass ( )
?>

Aici am creat o clasă în spațiul de nume my\oneProject. Apropo, trebuie să scrieți exact backslash. Nu te confuzi!

Acum în dosar index.php hai sa scriem urmatoarele

require_once("myclass.php");
$mc = new MyClass(); // Eroare: clasa nu a fost găsită
$mc = new my\oneProject\MyClass(); // totul merge
?>

După cum puteți vedea, acum nu este posibil să creați o clasă așa, trebuie să specificați în care spatiu de nume el stă întins.

Putem specifica mai multe deodată spații de numeîntr-un singur dosar

proiect namespace;

Const CONNECT_OK = 1;
Conexiune de clasă ( )
funcția connect() ( )

NamespaceAnotherProject;

Const CONNECT_OK = 1;
Conexiune de clasă ( )
funcția connect() ( )
?>

În ciuda faptului că avem nume absolut identice de clase, funcții și constante, nu vom avea un conflict de nume, deoarece se află în spații diferite.

De asemenea, putem folosi sintaxa parantezei.

proiect spatiu de nume (

Const CONNECT_OK = 1;
Conexiune de clasă ( )
funcția connect() ( )
}

Spațiu de nume AnotherProject (

Const CONNECT_OK = 1;
Conexiune de clasă ( )
funcția connect() ( )
}
?>

Dacă combinați codul în spațiu de nume global cu cod în alte spații, atunci se folosește doar sintaxa cu paranteze.

proiect spatiu de nume (

Const CONNECT_OK = 1;
Conexiune de clasă ( )
funcția connect() ( )
}

Spațiu de nume ( // cod global
sesiune_start();
$a = Proiect\connect();
echo Proiect\Conexiune::start();
}
?>

De asemenea, nu uitați că definirea unui spațiu de nume ar trebui să fie întotdeauna prima linie de cod. Daca scrii asa va aparea o eroare

Pentru a afla în ce spațiu de nume vă aflați în prezent, puteți utiliza constanta __NAMESPACE__

proiect namespace;
ecou """, __NAMESPACE__, """; // va imprima "Proiect"
?>

Folosind această constantă, puteți, de exemplu, să construiți nume în mod dinamic

proiect namespace;

Funcția incl($classname) (
$a = __NAMESPACE__ . „\\” . $numeclasa;
returnează $a nou;
}
?>

Deci asta e tot pentru azi. Puteți obține mai multe informații și cunoștințe practice urmând cursul

Mi-am încapsulat recent proiectul într-un spațiu de nume și am întâlnit problema lipsei de documentație adecvată. Tot ceea ce am reușit să găsim datează din aproximativ 2009 și este aproape 2012... În materialul găsit, există o mulțime de locuri nefuncționale care folosesc ceva care nu este în versiunea actuală de php. În acest sens, aș dori să fac un pic de lumină asupra acestei probleme.
Deci, ce este un spațiu de nume sau un spațiu de nume? Marea wikipedia le definește astfel:

Spațiul de nume este un set, ceea ce înseamnă un model, un spațiu de stocare abstract sau un mediu creat pentru gruparea logică a identificatorilor unici (adică nume). Un identificator definit într-un spațiu de nume este asociat cu acel spațiu de nume. Același identificator poate fi definit independent în mai multe spații. Astfel, o valoare asociată cu un identificator definit într-un spațiu de nume poate (sau nu) să aibă același sens (sau mai degrabă diferit) ca același identificator definit într-un alt spațiu de nume. Limbile care știe spațiul de nume definesc reguli care indică spațiului de nume căruia îi aparține un identificator (adică definiția acestuia).wiki

Tot clar? Este de fapt simplu. Înainte de versiunea 5.3, în php existau doar două spații - global (în care era executat codul principal) și local (în care erau definite variabilele funcției).

De la versiunea 5.3 totul s-a schimbat. Acum vă puteți defini spațiul de nume în care vor exista clasele, metodele etc.


Sper că a devenit puțin mai clar.

Am numit în mod special clasele la fel. Deoarece sunt definite în spații diferite, sunt două clase diferite, în ciuda acelorași nume. Scriptul principal încă funcționează în spațiul global, nimic nu s-a schimbat aici și clasele și funcțiile pot fi încă definite în el. Atunci pentru ce sunt spațiile? În primul rând, pentru a vă asigura că atunci când includeți un fișier cu un cadru sau bibliotecă, clasele dvs. nu vor suprascrie clasele cadrului sau invers.

Pentru a utiliza clasele definite în spațiul dvs. de nume, trebuie să importați spațiul definit în cel global în locul potrivit (de obicei prefer să fac acest lucru la începutul fișierului). Pentru a face acest lucru, utilizați cuvântul cheie use

Atenţie: din anumite motive php nu permite utilizarea cuvântului cheie utilizareîn stare blocuri și bucle

Să luăm exemplul din imagini și să îl implementăm în cod:

Atenţie: cuvântul cheie namespace trebuie să fie situat chiar la începutul fișierului, imediat după
fisierul A.php
Fișierul B.php
Este posibilă o sintaxă alternativă:
Este recomandat să declarați fiecare spațiu de nume într-un fișier separat. Deși se poate într-unul, nu este strict recomandat!
Acum să trecem la al treilea fișier, în care va funcționa scriptul nostru principal
index.php
S-ar părea că acesta este un avantaj, se adaugă doar mai mult cod, dar acest lucru nu este în întregime adevărat, puțin mai departe voi da un exemplu de clasă de încărcare automată, cu care liniile care conectează fișierele cu clase vor fi inutile.
Acum să ne uităm la cursurile noastre.

Atenţie: folosind operatorul de rezoluție a domeniului (::) în spațiile de nume php nepermis! Singurul lucru pentru care este potrivit este accesarea metodelor și constantelor clasei statice. La început au vrut să-l folosească pentru spațiul de nume, dar apoi s-au decis să nu-l facă din cauza problemelor apărute. Prin urmare, o construcție ca A::A::say(); este invalid și va avea ca rezultat o eroare.

Pentru spațiile de nume trebuie să utilizați caracterul bară oblică inversă „\”
Atenţie: Pentru a evita neînțelegerile, este necesar să evadați acest caracter atunci când este folosit în șiruri de caractere: „\\”

Spațiile de nume pot fi imbricate unul în celălalt, să adăugăm fișierului nostru A.php:
iar în index vom scrie următoarele:

Un punct important este utilizarea alias-urilor pentru spațiile importate. Ai putea scrie A\subA::say(); Veți fi de acord că este dificil să scrieți căi complete către spații de fiecare dată; pentru a evita acest lucru, au fost introduse aliasuri. La compilare se va întâmpla următoarele: în loc de sub alias, va fi înlocuit A\subA, deci vom obține apelul A\subA::say();

Ce se întâmplă atunci când apelăm funcții definite în spațiul global? PHP caută mai întâi o funcție în spațiul în care lucrați în prezent și, dacă nu o găsește, trece în domeniul global. Pentru a indica imediat că utilizați o funcție globală, trebuie să o precedați cu o bară oblică inversă.

Pentru a evita problemele cu încărcarea automată a claselor din spații, sistemul de fișiere trebuie să fie organizat similar cu organizarea spațiilor. De exemplu, avem un folder rădăcină clase, unde vor fi stocate clasele noastre, apoi spațiile noastre pot fi organizate după cum urmează
clase\A\A.php
clase\A\sub\A.php (subspațiul va fi plasat într-un fișier separat)
clase\B\B.php

PHP are o constantă magică __NAMESPACE__ care conține numele spațiului curent.

Și acum despre încărcarea automată.

Clasa de mai jos nu este a mea, doar am făcut-o să funcționeze și am îmbunătățit-o puțin, luată de aici.
Atenţie: Pentru ca clasele dvs. să fie încărcate, numele clasei trebuie să se potrivească cu numele fișierului!

" .$fișier ."în " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("conectat " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closedir($handle); ) ) funcție statică privată StPutFile($date) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $fișier = fopen($dir, "a"); flock($fișier, LOCK_EX); fwrite($fișier, ("║" .$date ."=>" .date(" d.m.Y H:i:s")."

" .PHP_EOL)); flock($fișier, LOCK_UN); fclose ($fișier); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Dacă vă uitați la numele claselor care vin pentru încărcare, veți vedea că fiecare clasă este precedată de un prefix din spațiul de nume care este specificat în utilizare. Acesta este motivul pentru care vă recomand să folosiți locația fișierelor în directoare similare cu spațiul de nume; acest lucru accelerează căutarea la una sau două iterații.

Acum indexul nostru poate fi scris astfel:
Acum toate clasele și interfețele pe care le veți folosi vor fi încărcate automat.

Pentru a demonstra unele dintre capacitățile dinamice ale limbajului cu spații, să declarăm o altă clasă:
test.php

Index.php
sayName("test"); //sau puteți face acest test\sayName("test2"); //sau ca asta $obj::sayName("test"); //sau puteți face acest test::sayName("test2");

Sper că articolul meu va fi de folos cuiva.

(PHP 5 >= 5.3.0, PHP 7)

Înainte de a discuta despre utilizarea spațiilor de nume, este important să înțelegeți cum PHP știe ce element cu spații de nume solicită codul dvs. Se poate face o analogie simplă între spațiile de nume PHP și un sistem de fișiere. Există trei moduri de a accesa un fișier într-un sistem de fișiere:

  1. Nume relativ de fișier ca foo.txt. Aceasta se rezolvă la actualdirectory/foo.txt unde directorul curent este directorul ocupat în prezent. Deci, dacă directorul curent este /acasă/foo, numele se rezolvă la /home/foo/foo.txt.
  2. Nume relativ de cale ca subdirectorul/foo.txt. Aceasta se rezolvă la actualdirectory/subdirector/foo.txt.
  3. Nume absolut de cale ca /main/foo.txt. Aceasta se rezolvă la /main/foo.txt.
Același principiu poate fi aplicat elementelor cu spații de nume în PHP. De exemplu, un nume de clasă poate fi referit în trei moduri:
  1. Nume necalificat sau un nume de clasă fără prefix, cum ar fi $a = new foo(); sau foo::staticmethod(); actualnamespace, acest lucru se rezolvă la currentnamespace\foo foo. O avertizare: numele necalificate pentru funcții și constante se vor rezolva în funcții și constante globale dacă funcția sau constanta cu spațiu de nume nu este definită. Consultați Utilizarea spațiilor de nume: alternativă la funcția/constantele globale pentru detalii.
  2. Nume calificat sau un nume de clasă prefixat, cum ar fi $a = nou subnamespace\foo(); sau subnamespace\foo::staticmethod();. Dacă spațiul de nume curent este actualnamespace, acest lucru se rezolvă la currentnamespace\subnamespace\foo. Dacă codul este cod global, fără spații de nume, aceasta se rezolvă la subnamespace\foo.
  3. Nume complet calificat sau un nume prefixat cu operator de prefix global, cum ar fi $a = nou \currentnamespace\foo(); sau \currentnamespace\foo::staticmethod();. Aceasta se rezolvă întotdeauna la numele literal specificat în cod, currentnamespace\foo.

Iată un exemplu de cele trei tipuri de sintaxă din codul real:

namespace Foo\Bar\subnamespace;

const FOO = 1 ;
funcția foo()()
clasa foo
{
}
?>

spațiu de nume Foo\Bar;
include "fișier1.php";

const FOO = 2;
funcția foo()()
clasa foo
{
funcția statică staticmethod()()
}

/* Nume necalificat */
foo(); foo::staticmethod(); ecou FOO ;

/* Nume calificat */
subnamespace\foo(); // rezolvă funcția Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // se rezolvă la clasa Foo\Bar\subnamespace\foo,
// metoda staticmethod
echo subnamespace\FOO; // se rezolvă la constanta Foo\Bar\subnamespace\FOO

/* Nume complet calificat */
\foo\bar\foo(); // rezolvă funcția Foo\Bar\foo
\foo\Bar\foo::staticmethod(); // se rezolvă la clasa Foo\Bar\foo, metoda staticmethod
echo\Foo\Bar\FOO; // se rezolvă la constanta Foo\Bar\FOO
?>

Rețineți că pentru a accesa orice clasă globală, funcție sau constantă, poate fi folosit un nume complet calificat, cum ar fi \strlen() sau \Excepție sau \INI_ALL. ?>