V dnešním dílu našeho programátorského seriálu si povíme více o interface a o práci s metodami __get, __set a __call v prostředí PHP 5.
Interface
Interface by se dalo přeložit jako objektové rozhraní. Interface je v podstatě podobný třídě, ale s tím rozdílem, že umožňuje vytvořit pouze metody bez kódu. Třída, která potom dané rozhraní použije, musí tyto metody dodefinovat.
Interface je definován pomocí klíčového slova interface v podstatě úplně stejně jako standardní třída s tím rozdílem, že metody nesmí mít žádný kód. Třídy, které potom implementují interface musí kód těchto metod dodefinovat.
Všechny metody deklarované v interface musí být public.
<?php
interface zvuk
{
public function NapisZvuk();
}
class pes implements zvuk
{
public function NapisZvuk()
{
echo `haf<br>`;
}
}
$objekt = new pes;
$objekt->NapisZvuk();
?>
Samotné PHP nemá možnost vícenásobné dědičnosti, tedy toho, aby třída dědila vlastnosti od více tříd najednou. Interface je možnost, jak toto omezení obejít. Každá třída může převzít vlastnosti od jedné rodičovské třídy a od libovolného množství interface. Tak je možné zařídit bezpečnější vícenásobné dědění.
Metody __get a __set
Metoda __get se volá automaticky tehdy, když se pokusíme zjistit hodnotu datového členu, který neexistuje. Metoda __set se volá automaticky tehdy, když se pokusíme nastavit hodnotu datového členu, který neexistuje.
Samotné metody __get a __set si můžeme sami napsat, a pak by měly vypadat nějak takto:
__get ($jmeno);
__set ($jmeno, $hodnota);
Zde je jednoduchý příklad na využití metod __get a __set:
<?php
class pokus
{
public $z;
private $x = array(`a`=>1,`b`=>2,`c`=>3);
function __get($jmeno)
{
if (isset($this->x[$jmeno]))
{
$hodnota = $this->x[$jmeno];
echo `__get vrací hodnotu `,$hodnota,` pro `,$jmeno,`<br>`;
return $hodnota;
}
else
echo `__get nevrací žádnou hodnotu pro `,$jmeno,`<br>`;
}
function __set($jmeno, $hodnota)
{
if (isset($this->x[$jmeno]))
{
$this->x[$jmeno] = $hodnota;
echo `__set nastavila hodnotu `,$hodnota,` pro `,$jmeno,`<br>`;
}
else
echo `__set nenastavila žádnou hodnotu pro `,$jmeno,`<br>`;
}
}
$objekt = new pokus;
$objekt->z = 1;
$objekt->a = 100;
$objekt->b++;
?>
Metody __get a __set můžeme tedy využít na odchytávání přístupů do neexistujících datových členů. Co s takovými přístupy uděláme je potom už naše věc, konkrétně se stane to, co je předepsáno v metodách __get a __set.
Metoda __call
Stejně tak jako můžeme použít metody __get a __set pro odchytávání přístupů k neexistujícím datovým členům, tak můžeme použít metodu __call pro odchytávání přístupů k neexistujícím metodám.
Metodu __call si můžeme napsat sami a pak by vypadala nějak takto:
__call ($jmeno, $parametry)
Zde je jednoduchý příklad, jak použít metodu __call:
<?php
class pokus
{
function __call($jmeno, $parametry)
{
echo `Volání metody `,$jmeno,` s parametry `;
var_dump($parametry);
echo `<br>`;
}
}
$objekt = new pokus;
$objekt->ahoj(1,2,`nazdar`);
?>