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.







