Jdi na navigaci předmětu

Jmenné prostory

Namespaces

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

  • doporučení PSR-4 nebo PSR-0.
  • hierarchie souborového systému → hierarchie NS

Určování jmenného prostoru

  1. aktuální jmenný prostor (nekvalifikovaný, UN)

    foo → hledá se \CurrentNS\foo nebo \foo pokud není žádný aktuální NS

  2. kvalifikovaný název (QN)

    Sub\foo → hledá se \CurrentNS\Sub\foo nebo \Sub\foo pokud není žádný aktuální NS

  3. plně 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