OOP v PHP: Standard PHP Library (SPL) – základní rozhraní
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.
Mohlo by vás také zajímat
-
ZONER Webmail jako první v Česku přináší BIMI s VMC
11. července 2024 -
Jak vybrat doménu: Co je dobré vědět?
2. září 2024 -
Praktické rady na zabezpečení redakčního systému WordPress
27. února 2023 -
AI v programování: Jak používat GitHub Copilot (část 2)
19. února 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024