Knihovna SPL Marcuse Boergera neobsahuje pouze funkce pro práci s autoloadem, jak by se vám po předchozím článku mohlo zdát. Obsahuje desítky rozhraní a tříd, které vám mohou výrazně zpříjemnit práci s objekty. Náplní tohoto článku je popis základních rozhraní Countable a ArrayAccess.

Countable

Rozhraní Countable umožňuje volání funkce count() i na objekty. Běžně této funkci předáváte jako první parametr pole a funkce vrací počet elementů v poli. Rozhraní obsahuje pouze jednu metodu count(), která vrací číslo (integer).

class Json implements Countable 
{ 
    private $_data = array(); 
    public function __construct($data) 
    { 
        $this->_data = json_decode($data, true); 
    } 
    public function count() 
    { 
        return count($this->_data); 
    } 
} 

$data = '{"a":1,"b":2,"c":3}'; 
$json = new Json($data); 
echo count($json);

ArrayAccess

Rozhraní ArrayAccess slouží pro vkládání prvků do objektu způsobem, kterým vkládáte prvky do pole. Velmi často se používá s návrhovým vzorem Registry, který slouží jako vyspělejší náhrada globálních proměnných v objektově orientovaném programování.

Rozhraní ArrayAccess obsahuje čtyři základní metody:

Metoda Prametry Návratová hodnota Popis
offsetExists() $key (povinný) boolean Zjišťuje, zda daná hodnota existuje někde v atributech třídy. Zavolá se použitím funkce isset() na objekt.
offsetUnset() $key (povinný) nic Odstraňuje atribut z třídy. Metoda se zavolá použitím funkce unset() na objekt.
offsetGet() $key (povinný) různá Navrací prvek uložený v objektu.
offsetSet() $key (povinný), $hodnota (povinný) nic Vkládá prvek do objektu.

V následujícím příkladu popisuji návrhový vzor Registry pro vkládání globálních proměnných:

<?php 
class RegistryException extends Exception {} 

/** 
* Uschovna globalnich promennych 
* 
* Trida slouzi pro uchovavani glovalnich promennych. Jedna se o nahradu 
* globalnich promennych v proceduralnim programovani. 
*/ 
final class Registry implements ArrayAccess 
{ 
    /** 
     * Soubor se vsemi globalnimi daty 
     * 
     * @var array 
     */ 
    private $_data = array(); 

    /** 
     * Uchovava instanci objektu 
     * 
     * @var Registry|null 
     */ 
    private static $_instance = null; 

    /** 
     * Singleton 
     * 
     * @param array|null $data Predane pole globalnich dat 
     * @return Registry 
     */ 
    public function getInstance($data = null) 
    { 
        if (!self::$_instance instanceof self) { 
            self::$_instance = new self($data); 
        } 
        return self::$_instance; 
    } 

    /** 
     * Privatni konstruktor nastavuje predana data (pokud nejake jsou:) 
     * 
     * @param array|null $data Predane pole globalnich dat 
     */ 
    private function __construct($data = null) 
    { 
        if ($data) { 
            $this->_data = (array) $data; 
        } 
    } 

    /** 
     * Vklada globalni promennou 
     * 
     * @param string $key 
     * @param mixed $value 
     */ 
    public function offsetSet($key, $value) 
    { 
        $this->_data[$key] = $value; 
    } 

    /** 
     * Vraci globalni promennou 
     * 
     * @param string $key 
     * @return mixed 
     * @throws RegistryException Vyhodi se v pripade, ze neesituje zadna takova globalni promenna 
     */ 
    public function offsetGet($key) 
    { 
        $this->_check($key, true); 
        return $this->_data[$key]; 
    } 

    /** 
     * Odstrani globalni promennou 
     * 
     * @param string $key 
     * @throws RegistryException Vyhodi se v pripade, ze neesituje zadna takova globalni promenna 
     */ 
    public function offsetUnset($key) 
    { 
        $this->_check($key, true); 
        unset($this->_data[$key]); 
    } 

    /** 
     * Zkonstroluje, zda globalni promenna existuje 
     * 
     * @param string $key 
     */ 
    public function offsetExists($key) 
    { 
        return $this->_check($key); 
    } 

    /** 
     * Zkontroluje, zda existuje dany klic 
     * 
     * @param string $key 
     * @param bool $exception Ma se vyhodit vyjimka nebo vratit false v pripade nepravdy? 
     */ 
    private function _check($key, $exception = false) 
    { 
        if (!array_key_exists($key, $this->_data)) { 
            if ($exception) { 
                throw new RegistryException('Hodnota <strong>' . $key . '</strong> nebyla nastavena!'); 
            } else { 
                return false; 
            } 
        } 
        return true; 
    } 
} 

try { 
    $global = Registry::getInstance(array('name' => 'Jakub', 
            'surname' => 'Mrozek')); 
    //vlozeni nove globalni promenne 
    $global['magazin'] = 'Interval'; 

    //ziskani glb. promenne, vypise Interval 
    echo $global['magazin']; 

    //kontroluje existenci promenne, vypise 1 
    echo (int) isset($global['magazin']); 

    //odstrani globalni promennou 
    unset($global['magazin']); 

    //konstroluje existuenci promenne, tentokrat vypise 0 
    echo (int) isset($global['magazin']); 

    //globalni promenna byla smazana, vyhodi se vyjimka 
    echo $global['magazin']; 

} catch (RegistryException $e) { 
    //Zpracovani vyjimky 
} 
?>

Pozn. red.: Zdůrazňujeme, že tento text se týká PHP 5.

Žádný příspěvek v diskuzi

Odpovědět