pondělí 12. února 2007

OOP v PHP 3 - interface

Interface (rozhranní) je jedna z věcí, která je často přeceňována nebo nedoceňována. Oč vlastně jde?

Představte si, že se dostanete do situace, kdy budete potřebovat určit, že objekt "umí" něco, co se od něj očekává, ale nejsme si jistí, zda to tak je :)

Uvedu příklad:
Mám objekty manželka, děti, papoušek, pes a tchýně. Všechny objekty mohu považovat za součást rodiny. Problém nastává ve chvíli, kdy bych potřeboval vědět, kdo z uvedených rodinných příslušníků umí vařit. Vaření si mohu představit jako metodu, která mi provede danný úkon a vytvoří (vrátí) objekt jídlo.

Toto je klasický příklad, kdy mohu použít (implementovat) interface. Nejdříve si vytvořím vlastní interface, které bude obsahovat metodu uvarJidlo().

interface UmiVarit
{
public function uvarJidlo(Jidlo $jidlo);
{
?>


Nyní mám rozhranní, které je potřeba implementovat na ty třídy, které budou moci vařit jídlo.

class Manzelka implements UmiVarit
{
public function uvarJidlo(Jidlo $jidlo)
{
return "manzelka uvarila: ". $jidlo->getNazev();
}
}?>


Takže nyní, když zavolám objekt (rodinného příslušníka), jsem schopen určit, který z nich vařit umí a který nikoli.

$rodina[] = new Manzelka();
$rodina[] = new Tchyne();
$rodina[] = new Pes();
foreach($rodina as $val) {
if($val instanceof UmiVarit) {
echo "umi varit: ". $val->uvarJidlo(new ChlebaVeVajicku());
}
}
?>


Interface můžete chápat jako svou vlastní kontrolu, kde si programátor označuje jednotlivé třídy podle toho, co mají umět. Myslím si, že úplnému pochopení, k čemu vlastně interface mohu využít a jak použít je otázkou praxe. Jak se říká: nic se nemá přehánět. A to platí i zde. Na druhou stranu, ignorace implementování rozhranní vede k chaosu a nižší funkčnosti.

Co se týče pravidel, jsou zde jasně danná specifika:

  • interface může obsahovat konstanty a veřejné metody

  • třída implementující interface musí obsahovat metody podle interface

  • třída může implementovat více rozhranní, které se oddělují čárkou (např. UmiVarit, PrepinaTelevizi)



Samotné PHP obsahuje několik předdefinovaných rozhranní, z nichž nejzajímavější je Iterator.

Tak by bylo k interface vše. Samozřejmě, dalo by se zde napsat spoustu dalších možností a využití, ale stačí, když si budu pamatovat, že Interface usnadňuje a označuje třídy tak, abych byl schopen použít jejich specifické vlastnosti.

Příště již ke zmíněným abstraktním třídám a dědičnosti, která je asi tím nejsložitějším tématem v OOP vůbec.

10 komentářů:

  1. Je to stále php? :-) když to vidím, tak zjištiji, že php neumím. Jsem totiž jen na začátku php a mysql. No, mám se ještě co učit

    OdpovědětVymazat
  2. Předem je důležité si uvědomit, že OOP má svá vlastní specifika co se týče syntaxe. Téměř ve všech jazycích, podporující OOP je ta syntaxe velice podobná (Java, C#, PHP, ...).

    Jednou z věcí je řešení malých problémů, typu (jak efektivně odstranit diakritiku, ...) a druhou je návrh kódu, který poté v jednotlivých metodách řeší malé problémy. Objekty se dají chápat jako obal nad procedurálním kódem. Než ovšem tento "obal" pochopím a naučím se přemýšlet v opačné logice, při návrhu kódu, chvíli to trvá. Věřte mi, že se to každopádně vyplatí.

    OdpovědětVymazat
  3. Super seriál, doufám v pokračování :-) Pro mě osobně jsou nejpřínosnější praktické příklady - chápu princip a syntaxi OOP v PHP, trochu ale bojuju s použitím v konkrétní aplikaci...

    OdpovědětVymazat
  4. Rekl bych ze na treti dil serialu o OOP v PHP je toto trochu moc vepredu. Ve tretim dilu bych cekal srozumitelne vysvetlenou viditelnost metod a promenych. Potom dediscnost. A postupne pritvrdovat.

    Innterface je takova zvlatni dedicnost.


    BTW: Pekny blog, pokud bude takhle hezky pokracovat necham na blogu sem odkaz.

    OdpovědětVymazat
  5. Rozumím, problém většinou bývá, že proto, aby jsi byl schopen začít psát v objektech, tak musíš znát spoustu věcí, které nabalují další a další. Spíše bych to viděl tak, že prolétnu všechny potřebné věci a ty pak budu pomalu aplikovat a upřesňovat.
    Myslím, že viditelnost bez použítí a dedičnosti se špatně chápe. Udividíme, kam se nakonec dostanu, rád bych hlavně na konci předvedl reálný projekt, který OOP využívá.
    Moc informací o PHP a objektech není, takže budu určitě pokračovat.
    Díky za pochvalu, hned má člověk lepší náladu ;)

    OdpovědětVymazat
  6. Fakt super stránky, jsi skvělej :o)

    OdpovědětVymazat
  7. Takže jednička s hvězdičkou :-) Píšeš ty o věcech které jsou zajímavé.
    Neděkuj, děkovat mohou čtenáři :-), takže díky jdu číst další díl.

    OdpovědětVymazat
  8. OOP v PHP je celkom sranda .. nasiel tiez jeden zaujimavy clanok na
    http://www.a-scripts.com/index.php/php-tutorials/46-brief-introduction-to-oop

    OdpovědětVymazat

React a hrátky s TypeScriptem

V minulosti jsem se již několikrát zmiňoval, že používat JavaScript bez statických typů, je stejné jako jezdit na kole poslepu. Nemusí se...