Reklama

zoner.cz | czechia.com | regzone.cz | inshop.cz | zonerpress.cz | zonerantivirus.com | zonerama.cz | knihyfoto.cz | fotoden.cz

interval.cz

OOP v PHP: Standard PHP Library (SPL) - základní rozhraní

15. 02. 2006 | Jakub Mrozek | PHP | Komentáře: 0

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.


Další aktuální články na interval.cz

Tematicky související články

Dejte vědět i ostatním o článku

Diskuse (počet komentářů: 0)

Buďte prvním návštěvníkem, který přidá nový komentář.

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Reality bez provize – revoluční realitní portál
pronájem, prodej a koupě realit bez provize.
SSLmarket
Profesionální eshop Zoner inShop od 990 Kč.
Reklama
Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena. Hosting zajišťuje CZECHIA.COM. SSL certifikáty pro domény. Powered by WordPress.