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
namespacemusí 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\OrderPoužívání jmenných prostorů
- magická konstanta
__NAMESPACE__ - zápis
Product::classvrací ř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\foonebo\foopokud není žádný aktuální NSkvalifikovaný název (QN)
Sub\foo→ hledá se\CurrentNS\Sub\foonebo\Sub\foopokud 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í
usebě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