Primjeri korištenja prostora imena u php. Imenski prostori u PHP-u, objašnjeno. Prostori imena: Višestruki opsegi opisa

Nedavno sam inkapsulirao svoj projekat u imenskom prostoru i naišao na problem nedostatka odgovarajuće dokumentacije. Sve što smo uspjeli pronaći datira otprilike iz 2009. godine, a skoro je 2012. godine... U pronađenom materijalu ima dosta neradnih mjesta koja koriste nešto što nije u trenutnoj verziji php-a. S tim u vezi, želio bih malo rasvijetliti ovo pitanje.
Dakle, šta je imenski prostor ili imenski prostor? Velika wikipedija ih ovako definira:

Prostor imena je skup, što znači model, apstraktno skladište ili okruženje kreirano za logičko grupisanje jedinstvenih identifikatora (tj. imena). Identifikator definiran u imenskom prostoru je pridružen tom imenskom prostoru. Isti identifikator može se nezavisno definisati u više prostora. Dakle, vrijednost povezana s identifikatorom definiranim u jednom imenskom prostoru može (ili ne mora) imati isto (ili radije drugačije) značenje kao isti identifikator definiran u drugom imenskom prostoru. Jezici svjesni imenskog prostora definiraju pravila koja pokazuju kojem imenskom prostoru pripada identifikator (tj. njegova definicija).wiki

Sve jasno? To je zapravo jednostavno. Prije verzije 5.3, postojala su samo dva prostora u php-u - globalni (u kojem se izvršavao vaš glavni kod) i lokalni (u kojem su bile definirane varijable funkcije).

Od verzije 5.3 sve se promijenilo. Sada možete definirati svoj prostor imena u kojem će postojati vaše klase, metode itd.


Nadam se da je postalo malo jasnije.

Izričito sam isto nazvao razrede. Pošto su definisane u različitim prostorima, to su dve različite klase, uprkos istim imenima. Glavna skripta i dalje funkcionira u globalnom prostoru, ovdje se ništa nije promijenilo i u njoj se i dalje mogu definirati klase i funkcije. Pa čemu onda prostori? Prije svega, kako biste bili sigurni da kada uključite datoteku sa nekim okvirom ili bibliotekom, vaše klase neće nadjačati klase okvira ili obrnuto.

Da biste koristili klase definisane u vašem imenskom prostoru, potrebno je da uvezete prostor koji definirate u globalni na pravo mjesto (obično radije to radim na početku datoteke). Da biste to učinili, koristite ključnu riječ use

pažnja: iz nekog razloga php ne dozvoljava upotrebu ključne riječi koristiti u blokovima stanja i petlji

Uzmimo primjer sa slika i implementirajmo ga u kodu:

pažnja: ključna riječ namespace mora biti smještena na samom početku datoteke, odmah nakon
fajl A.php
B.php fajl
Moguća je alternativna sintaksa:
Preporučuje se deklarisanje svakog imenskog prostora u zasebnoj datoteci. Iako je moguće u jednom, to se striktno ne preporučuje!
Sada idemo na treću datoteku, u kojoj će funkcionirati naša glavna skripta
index.php
Čini se da je to prednost, dodaje se samo još koda, ali to nije sasvim točno, malo dalje ću dati primjer klase za automatsko učitavanje, s kojom će linije koje povezuju datoteke s klasama biti nepotrebne.
Pogledajmo sada naše časove.

pažnja: koristeći operator rezolucije opsega (::) u php imenskim prostorima nije dopusteno! Jedina stvar za koju je pogodan je pristup metodama statičke klase i konstantama. U početku su ga htjeli koristiti za imenski prostor, ali su se onda odlučili protiv toga zbog problema koji su se pojavili. Stoga, konstrukcija poput A::A::say(); je nevažeća i rezultirat će greškom.

Za prostore imena morate koristiti obrnutu kosu crtu "\"
pažnja: Da biste izbjegli nesporazume, potrebno je izbjeći ovaj znak kada se koristi u nizovima: "\\"

Imenski prostori mogu biti ugniježđeni jedan unutar drugog, dodajmo u našu A.php datoteku:
a u indeks ćemo napisati sljedeće:

Važna stvar je korištenje alijasa za uvezene prostore. Možete napisati A\subA::say(); Složićete se da je teško svaki put pisati pune putanje do razmaka; kako bi se to izbeglo, uvedeni su aliasi. Prilikom kompajliranja dogodit će se sljedeće: umjesto alias sub, A\subA će biti zamijenjen, tako da ćemo dobiti poziv A\subA::say();

Što se onda događa kada se pozivaju funkcije definirane u globalnom prostoru? PHP prvo traži funkciju unutar prostora u kojem trenutno radite, a ako je ne pronađe, prelazi u globalni opseg. Da biste odmah naznačili da koristite globalnu funkciju, morate joj prethoditi obrnutu kosu crtu.

Da bi se izbjegli problemi sa automatskim učitavanjem klasa iz prostora, sistem datoteka mora biti organiziran slično organizaciji prostora. Na primjer, imamo korijenski folder classes, gdje će naše klase biti pohranjene, tada se naši prostori mogu organizirati na sljedeći način
classes\A\A.php
classes\A\sub\A.php (podprostor će biti smješten u poseban fajl)
classes\B\B.php

PHP ima magičnu konstantu __NAMESPACE__ koja sadrži ime trenutnog prostora.

A sada o automatskom učitavanju.

Klasa ispod nije moja, samo sam je napravio i malo poboljšao, preuzeto odavde.
pažnja: Da bi se vaše klase učitale, ime klase mora odgovarati imenu datoteke!

".$file ." u " .$filepath)); if (file_exists($filepath))) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closeir($handle); ) ) privatna statička funkcija StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ."

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Ako pogledate imena klasa koje dolaze za učitavanje, vidjet ćete da svakoj klasi prethodi prefiks iz imenskog prostora koji je specificiran u upotrebi. Zbog toga preporučujem korištenje lokacije datoteka u direktorijima sličnim imenskom prostoru; ovo ubrzava pretragu na jednu ili dvije iteracije.

Sada se naš indeks može napisati ovako:
Sada će se sve klase i interfejsi koje ćete koristiti automatski učitati.

Da bismo demonstrirali neke od dinamičkih mogućnosti jezika s razmacima, deklarirajmo drugu klasu:
test.php

Index.php
sayName("test"); //ili možete uraditi ovaj test\sayName("test2"); //ili ovako $obj::sayName("test"); //ili možete uraditi ovaj test::sayName("test2");

Nadam se da će moj članak nekome biti od koristi.

PHP, počevši od verzije 5.3, nam je dao prostore imena. Od tada se vodila spora i burna rasprava o tome kako koristiti ovaj prostor imena?
Neki okviri, kao što su Symphony, Laravel i, naravno, Zend, usvojili su ovu tehnologiju.
Sve se to manje-više uklapa u MVC šemu. Ostaje jedna, vjerovatno vječna, debata: koji bi trebao biti glavni bračni par aplikacije - model i kontroler?
Neki nam kažu da bi model trebao biti stasit i debeo, a uz nju vitak i mršav Kontrolor. Jednom riječju - matrijarhat.
Drugi, naprotiv, smatraju da Kontrolor mora svime upravljati i komandovati, pa ispada solidan i dobro uhranjen. A s njim je i mršavi, vitki model, čiji se zadatak svodi na davanje i donošenje. Ovo je patrijarhat.
Dakle, šta je bolje u MVC šemi? Patrijarhat ili matrijarhat?
Pogledajmo ovo iz perspektive izgradnje porodične jedinice zasnovane na demokratiji. I neka nam Namespace pomogne u tome.

Ne volimo debele, nezgrapne kontrolere koji, poput bika u prodavnici porculana, mogu uništiti cijelu aplikaciju ako ste nepažljivi.
Ne volimo ni debele modele. Pa, ko ih voli? Mora da su dostojni postolja!
Pokušajmo, uz pomoć Namespacea, kao sa dobrim provodadžijom, stvoriti skladnu porodicu.

Prvo, kreirajmo kostur aplikacije. Koliko god to bilo banalno, neka bude blog.

Napravili smo osnovnu strukturu u kojoj:

  • Blog je skladište naše aplikacije;
  • Views and Templates - skladištenje pogleda i šablona;
  • Uslužni program - spremište zajedničkih biblioteka;
  • index.php - bootstrap skripta;
  • Post - tu treba da se odigra porodična idila Kontrolora i Modela.

Sa index.php sve je jednostavno:

run(); /* * kraj index.php */

Određujemo potrebne staze i kreiramo autoloader.
Autoloader učitava potrebne klase, koje se nalaze u hijerarhiji foldera u skladu sa prostorom imena klase. Na primjer, klasa BlogPostServicesView bi se pretraživala u Blog/Post/Services.
I evo prvog susreta sa Namespaceom.
Kada pokrenemo index.php, kreiramo instancu aplikacije Blog, čija se klasa učitava sa Blog/Blog.php.
Hajde da ga pogledamo.

post = nova objava(); ) javna funkcija run() ( $this->post->view->all(); ) )//end class Blog

Kada kreiramo klasu Blog, u nju ubacujemo klasu Post sa Namespace BlogPost i autoloader je učitava sa Blog/Post/Post.php.
Vjerovatno se ova klasa može nazvati Controller,

pogled = novi Pogled(); ) )//kraj razreda Post

Subjekt Pošta uključuje:
- struktura samog zapisa podataka - BlogPostEntitiesPostEntity.php

Usluge koje opslužuju zahtjeve kontrolora - BlogPostServicesView.php (jedna od usluga, na primjer)

db = novi DB(); )//end __construct public function all() ( $posts = $this->db->survey(); Contemplate::compose(array("header" => "header", "main" => "main", "footer" => "footer",), array("posts" => $posts, "title" => "Viper sajt",)); ) )//end class PostView

Sistem interakcije baze podataka - BlogPostRepositoriesDB.php - evo ga, naš tanak, elegantan Model,
Samo daj, donesi i ništa više!

dbh = novi PDO("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => true)); ) catch (PDOException $e) ( echo "Greška!: " . $e->getMessage() ."
"; die(); ) )//end __construct public function survey() ( $query_view = $this->dbh->prepare("SELECT * from posts"); $query_view->execute(); return $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//kraj ankete )//završi klasu Db

Kao rezultat, uspjeli smo kreirati strukturu aplikacije u kojoj su sve komponente dobro povezane, dok smo postigli jasno razdvajanje klasa, gdje svaka klasa obavlja svoj zadatak. Naš kontroler je tanak i istovremeno moćan. Model mu odgovara. Savršena porodica!
I sve zahvaljujući Namespaceu.

Ne raspravljam, u mnogim slučajevima okvir je zgodan. Ali gledajte, Namespace vas ne podsjeća ni na što?
Jasna podjela na klase, stroga i istovremeno fleksibilna hijerarhija direktorija i klasa, potpuno podređena programeru.
Ponekad ne postoji tako značajan dodatak u obliku stotina datoteka i klasa u obliku okvira.
Nepostojanje prokrustovog kreveta pravila za interakciju klasa i komponenti.

Članak je inspirisan razmišljanjima o ovoj temi od strane Taylora Otwella, autora Laravel frameworka, na čemu mu veliko hvala.
Adresa primjera izvornog koda na GitHubu.

Zdravo. U današnjem članku ćemo pogledati, šta su imenski prostori u PHP-u.

Ako ga koristite duže vrijeme OOP, onda ste vjerovatno naišli na situaciju u kojoj ste, prilikom povezivanja biblioteke treće strane, doživjeli neuspjeh zbog činjenice da već koristite ista imena klasa u svom kodu kao u biblioteci. Ovo se posebno može dogoditi ako koristite uobičajena imena kao što su "model", "db" i tako dalje. Sada ću vam reći kako to popraviti.

Imenski prostor- ovo je neka vrsta skladišta stvorena za apstraktno grupisanje jedinstvenih identifikatora (imena).

One. ako koristite imenski prostori, tada možete sigurno povezati biblioteke trećih strana i ne plašiti se da će imati ista imena kao u vašem kodu. Završimo sa teorijom i pređimo na praksu.

Kreirajmo fajl myclass.php sa ovim sadržajem

imenski prostor my\oneProject;
razred MyClass ( )
?>

Ovdje smo kreirali klasu u imenskom prostoru moj\oneprojekt. Usput, morate napisati tačno obrnutu kosu crtu. Nemojte se zbuniti!

Sada u fajlu index.php hajde da napišemo sledeće

require_once("myclass.php");
$mc = nova MyClass(); // Greška: klasa nije pronađena
$mc = novi moj\oneProject\MyClass(); // sve radi
?>

Kao što vidite, sada nije moguće kreirati klasu tek tako, morate odrediti u kojoj imenskog prostora on leži.

Možemo navesti nekoliko odjednom imenski prostori u jednom fajlu

namespace Project;

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )

NamespaceAnotherProject;

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )
?>

Uprkos činjenici da imamo apsolutno identična imena klasa, funkcija i konstanti, nećemo imati sukob imena, jer leže u različitim prostorima.

Također možemo koristiti sintaksu zagrada.

imenski projekat (

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )
}

Imenski prostor AnotherProject (

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )
}
?>

Ako kombinirate kod u globalni imenski prostor sa kodom u drugim prostorima, tada se koristi samo sintaksa sa zagradama.

imenski projekat (

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )
}

Imenski prostor ( // globalni kod
session_start();
$a = Project\connect();
echo Project\Connection::start();
}
?>

Također, ne zaboravite da definiranje prostora imena uvijek treba biti prva linija koda. Ako ovako napišete doći će do greške

Da biste saznali u kojem se imenskom prostoru trenutno nalazite, možete koristiti konstantu __NAMESPACE__

namespace Project;
echo """, __NAMESPACE__, """; // će ispisati "Projekat"
?>

Koristeći ovu konstantu možete, na primjer, dinamički konstruirati imena

namespace Project;

Funkcija incl($classname) (
$a = __NAMESPACE__ . "\\" . $classname;
vrati novi $a;
}
?>

To je sve za danas. Više informacija i praktičnih znanja možete dobiti pohađanjem kursa

Nedavno sam inkapsulirao svoj projekat u imenskom prostoru i naišao na problem nedostatka odgovarajuće dokumentacije. Sve što smo uspjeli pronaći datira otprilike iz 2009. godine, a skoro je 2012. godine... U pronađenom materijalu ima dosta neradnih mjesta koja koriste nešto što nije u trenutnoj verziji php-a. S tim u vezi, želio bih malo rasvijetliti ovo pitanje.
Dakle, šta je imenski prostor ili imenski prostor? Velika wikipedija ih ovako definira:

Prostor imena je skup, što znači model, apstraktno skladište ili okruženje kreirano za logičko grupisanje jedinstvenih identifikatora (tj. imena). Identifikator definiran u imenskom prostoru je pridružen tom imenskom prostoru. Isti identifikator može se nezavisno definisati u više prostora. Dakle, vrijednost povezana s identifikatorom definiranim u jednom imenskom prostoru može (ili ne mora) imati isto (ili radije drugačije) značenje kao isti identifikator definiran u drugom imenskom prostoru. Jezici svjesni imenskog prostora definiraju pravila koja pokazuju kojem imenskom prostoru pripada identifikator (tj. njegova definicija).wiki

Sve jasno? To je zapravo jednostavno. Prije verzije 5.3, postojala su samo dva prostora u php-u - globalni (u kojem se izvršavao vaš glavni kod) i lokalni (u kojem su bile definirane varijable funkcije).

Od verzije 5.3 sve se promijenilo. Sada možete definirati svoj prostor imena u kojem će postojati vaše klase, metode itd.


Nadam se da je postalo malo jasnije.

Izričito sam isto nazvao razrede. Pošto su definisane u različitim prostorima, to su dve različite klase, uprkos istim imenima. Glavna skripta i dalje funkcionira u globalnom prostoru, ovdje se ništa nije promijenilo i u njoj se i dalje mogu definirati klase i funkcije. Pa čemu onda prostori? Prije svega, kako biste bili sigurni da kada uključite datoteku sa nekim okvirom ili bibliotekom, vaše klase neće nadjačati klase okvira ili obrnuto.

Da biste koristili klase definisane u vašem imenskom prostoru, potrebno je da uvezete prostor koji definirate u globalni na pravo mjesto (obično radije to radim na početku datoteke). Da biste to učinili, koristite ključnu riječ use

pažnja: iz nekog razloga php ne dozvoljava upotrebu ključne riječi koristiti u blokovima stanja i petlji

Uzmimo primjer sa slika i implementirajmo ga u kodu:

pažnja: ključna riječ namespace mora biti smještena na samom početku datoteke, odmah nakon
fajl A.php
B.php fajl
Moguća je alternativna sintaksa:
Preporučuje se deklarisanje svakog imenskog prostora u zasebnoj datoteci. Iako je moguće u jednom, to se striktno ne preporučuje!
Sada idemo na treću datoteku, u kojoj će funkcionirati naša glavna skripta
index.php
Čini se da je to prednost, dodaje se samo još koda, ali to nije sasvim točno, malo dalje ću dati primjer klase za automatsko učitavanje, s kojom će linije koje povezuju datoteke s klasama biti nepotrebne.
Pogledajmo sada naše časove.

pažnja: koristeći operator rezolucije opsega (::) u php imenskim prostorima nije dopusteno! Jedina stvar za koju je pogodan je pristup metodama statičke klase i konstantama. U početku su ga htjeli koristiti za imenski prostor, ali su se onda odlučili protiv toga zbog problema koji su se pojavili. Stoga, konstrukcija poput A::A::say(); je nevažeća i rezultirat će greškom.

Za prostore imena morate koristiti obrnutu kosu crtu "\"
pažnja: Da biste izbjegli nesporazume, potrebno je izbjeći ovaj znak kada se koristi u nizovima: "\\"

Imenski prostori mogu biti ugniježđeni jedan unutar drugog, dodajmo u našu A.php datoteku:
a u indeks ćemo napisati sljedeće:

Važna stvar je korištenje alijasa za uvezene prostore. Možete napisati A\subA::say(); Složićete se da je teško svaki put pisati pune putanje do razmaka; kako bi se to izbeglo, uvedeni su aliasi. Prilikom kompajliranja dogodit će se sljedeće: umjesto alias sub, A\subA će biti zamijenjen, tako da ćemo dobiti poziv A\subA::say();

Što se onda događa kada se pozivaju funkcije definirane u globalnom prostoru? PHP prvo traži funkciju unutar prostora u kojem trenutno radite, a ako je ne pronađe, prelazi u globalni opseg. Da biste odmah naznačili da koristite globalnu funkciju, morate joj prethoditi obrnutu kosu crtu.

Da bi se izbjegli problemi sa automatskim učitavanjem klasa iz prostora, sistem datoteka mora biti organiziran slično organizaciji prostora. Na primjer, imamo korijenski folder classes, gdje će naše klase biti pohranjene, tada se naši prostori mogu organizirati na sljedeći način
classes\A\A.php
classes\A\sub\A.php (podprostor će biti smješten u poseban fajl)
classes\B\B.php

PHP ima magičnu konstantu __NAMESPACE__ koja sadrži ime trenutnog prostora.

A sada o automatskom učitavanju.

Klasa ispod nije moja, samo sam je napravio i malo poboljšao, preuzeto odavde.
pažnja: Da bi se vaše klase učitale, ime klase mora odgovarati imenu datoteke!

".$file ." u " .$filepath)); if (file_exists($filepath))) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closeir($handle); ) ) privatna statička funkcija StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ."

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Ako pogledate imena klasa koje dolaze za učitavanje, vidjet ćete da svakoj klasi prethodi prefiks iz imenskog prostora koji je specificiran u upotrebi. Zbog toga preporučujem korištenje lokacije datoteka u direktorijima sličnim imenskom prostoru; ovo ubrzava pretragu na jednu ili dvije iteracije.

Sada se naš indeks može napisati ovako:
Sada će se sve klase i interfejsi koje ćete koristiti automatski učitati.

Da bismo demonstrirali neke od dinamičkih mogućnosti jezika s razmacima, deklarirajmo drugu klasu:
test.php

Index.php
sayName("test"); //ili možete uraditi ovaj test\sayName("test2"); //ili ovako $obj::sayName("test"); //ili možete uraditi ovaj test::sayName("test2");

Nadam se da će moj članak nekome biti od koristi.

(PHP 5 >= 5.3.0, PHP 7)

Prije diskusije o korištenju imenskog prostora, važno je razumjeti kako PHP zna koji element imenskog prostora vaš kod zahtijeva. Može se napraviti jednostavna analogija između PHP imenskih prostora i sistema datoteka. Postoje tri načina za pristup datoteci u sistemu datoteka:

  1. Relativno ime datoteke kao foo.txt. Ovo se rešava na currentdirectory/foo.txt gdje je tekući imenik trenutno zauzeti direktorij. Dakle, ako je trenutni direktorij /home/foo, ime se rješava u /home/foo/foo.txt.
  2. Relativno ime putanje kao poddirektorij/foo.txt. Ovo se rešava na trenutni imenik/poddirektorij/foo.txt.
  3. Apsolutno ime putanje kao /main/foo.txt. Ovo se rešava na /main/foo.txt.
Isti princip se može primijeniti na elemente s prostorom imena u PHP-u. Na primjer, naziv klase može se pozvati na tri načina:
  1. Nekvalificirano ime ili ime klase bez prefiksa kao $a = novi foo(); ili foo::staticmethod(); trenutni imenski prostor, ovo se rješava na tekućinamespace\foo foo. Jedno upozorenje: nekvalificirana imena za funkcije i konstante će se razriješiti na globalne funkcije i konstante ako funkcija ili konstanta s prostorom imena nije definirana. Pogledajte Korištenje imenskih prostora: povratak na globalnu funkciju/konstantu za detalje.
  2. Kvalificirano ime ili ime klase s prefiksom kao $a = novi podimenski prostor\foo(); ili subnamespace\foo::staticmethod();. Ako je trenutni imenski prostor trenutni imenski prostor, ovo se rješava na trenutniimespace\subnamespace\foo. Ako je kod globalni, kod bez imenskog prostora, ovo se rješava na podimenski prostor\foo.
  3. Potpuno kvalificirano ime ili ime s prefiksom sa globalnim prefiksnim operatorom kao što je $a = novo \currentnamespace\foo(); ili \currentnamespace\foo::staticmethod();. Ovo se uvijek rješava na doslovno ime navedeno u kodu, tekućinamespace\foo.

Evo primjera tri vrste sintakse u stvarnom kodu:

imenski prostor Foo\Bar\subnamespace;

const FOO = 1;
funkcija foo()()
class foo
{
}
?>

imenski prostor Foo\Bar;
uključiti "file1.php" ;

const FOO = 2;
funkcija foo()()
class foo
{
statička funkcija staticmethod()()
}

/* Nekvalifikovano ime */
foo(); foo::staticmethod(); echo FOO ;

/* Kvalifikovano ime */
podimenski prostor\foo(); // rješava u funkciju Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // rješava u klasu Foo\Bar\subnamespace\foo,
// metoda staticmethod
echo podimenski prostor\FOO; // rješava u konstantu Foo\Bar\subnamespace\FOO

/* Potpuno kvalifikovano ime */
\foo\bar\foo(); // rješava u funkciju Foo\Bar\foo
\foo\bar\foo::staticmethod(); // rješava u klasu Foo\Bar\foo, metod staticmethod
echo\Foo\Bar\FOO; // razrješava se na konstantu Foo\Bar\FOO
?>

Imajte na umu da se za pristup bilo kojoj globalnoj klasi, funkciji ili konstanti može koristiti potpuno kvalificirano ime, kao što je \strlen() ili \Izuzetak ili \INI_ALL. ?>