Jmenné prostory
K čemu je to dobré?
- řeší kolizi v názvech
- znovupoužitelnost kódu
- čitelnost
\
místo dlouhého názvu s_
- jmenné prostory (NS) používají i jiné jazyky
Vlastnosti
- platí pro třídy, rozhraní, traity, funkce a konstanty
- více souborů může být v jednom namespace
- hierarchické (obdobně k souborovému systému)
- importování do aktuálního NS, aliasování
Příklad
namespace Product;
const ON_STOCK = 1;
interface Countable { /* ... */ }
class Fruit implements Countable { /* ... */ }
function getWeight() { /* ... */ }
Deklarace
namespace
musí být první příkaz (nesmí mu předcházet ani html část)<p>chyba</p> <?php namespace Model; // ...
Deklarace - hierarchie
<?php
namespace Eshop\Model;
class Product { ... } // Eshop\Model\Product
class Order { ... } // Eshop\Model\Order
Používání jmenných prostorů
- magická konstanta
NAMESPACE
- zápis
Product::class
vrací řetězec vč. namespaců
namespace Eshop\Service;
use Database\Query\Order as SQLOrder; // "importuje" pod názvem SQLOrder
use Eshop\Model\Order; // "importuje" pod názvem Order
new Order(...);
new Eshop\Model\Product(...);
Automatické načítání tříd
Určování jmenného prostoru
aktuální jmenný prostor (nekvalifikovaný, UN)
foo
→ hledá se\CurrentNS\foo
nebo\foo
pokud není žádný aktuální NSkvalifikovaný název (QN)
Sub\foo
→ hledá se\CurrentNS\Sub\foo
nebo\Sub\foo
pokud není žádný aktuální NSplně kvalifikovaný název (FQN)
\CurrentNS\foo
→ vždy\CurrentNS\foo
(analogie absolutní cesty)
Pokud funkce foo
nebo konstanta FOO
není v aktuálním NS definovaná, automaticky se hledá \foo
resp. \FOO
(z důvodu kompatibility s vestavěnými funkcemi)
Určování jmenného prostoru - aliasy
- třídy, rozhraní a traity mohou být aliasovány (funkce nikoliv)
- vyhodnocování
use
během čtení kódu (compile time) - mají platnost v aktuálním souboru
- očekává se FQN bez úvodního lomítka
Více jmených prostorů v jednom souboru (nedoporučené)
platnost mezi složenými závorkami
namespace FirstNamespace { ... } namespace SecondNamespace { ... } namespace { /* global namespace */ }
bez závorek
namespace FirstNamespace; // ... kod namespace SecondNamespace; // ... kod