LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (20) - Objekty podruhé

Objekty v PHP umožňují používat dědičnost. Podívejme se jak a ukažme si na některá úskalí, která s sebou používání objektů v PHP nese.

5.7.2004 15:00 | Petr Zajíc | Články autora | přečteno 53933×

Komerční sdělení: Pořádáme Kurzy PHP

V minulém díle našeho seriálu jsme vytvořili objektový kalendář. A slíbili jsme si, že dnes bude řeč o dědičnosti a nebezpečí spojených s objekty v PHP. Podívejme se tedy na tyto dva aspekty objektově orientovaného programování v PHP:

Dědičnost

PHP, ostatně jako každý jiný objektově orientovaný jazyk umožňuje rozšiřovat objekty pomocí mechanizmu dědičnosti. V reálném světě dědí děti po rodičích a prarodičích některé vlastnosti, zatímco jinými vlastnostmi se liší. Kdybychom použili příklad s mobilními telefony, tak můžeme sestavit následující analogii: Objekt NOKIA 6210 bude potomkem třídy telefonů s tím, že bude (stejně jako každý jiný telefon) umět vytočit číslo, přijmout hovor a podobně. Narozdíl od "obecného" telefonu bude "šedesátdvadesítka" ovšem mít některé vlastnosti a metody, které jsou pro ni specifické. Tak třeba narozdíl od telefonu na pevné lince může specifikovat vlastnosti NabijBaterii, PřenesVizitkuPoInfraportu a tak dále.

V PHP může jedna třída dědit vlastnosti a metody jiné, rodičovské třídy s tím, že některé věci bude dělat jinak a některé bude možná umět navíc. Například bychom chtěli, aby náš skvělý kalendář uměl nejenom dny v měsíci zobrazit, ale aby rovněž uměl některé z nich zvýrazit. To může být užitečné třeba v případě, kdy má kalendář informovat o dnech, v nichž se něco děje. Mělo by to vypadat nějak takhle:

červenec 
Po   5 12 19 26
Út   6 13 20 27
St   7 14 21 28
Čt 1 8 15 22 29
2 9 16 23 30
So 3 10 17 24 31
Ne 4 11 18 25  

Půjdeme na to tak, že vyvineme novou třídu, nazvanou lepsi_kalendar, která bude danou vlastnost implementovat. Třídy potomků se v PHP tvoří pomocí klíčového slova extends. My použijeme třídu, která bude mít oproti předchozí třídě jednu vlastnost navíc - bude umět zpracovat pole nazvané zvyrazni_dny; v našem případě tedy dny prvního, sedmého, osmého, třináctého a šestadvacátého. Bude to vypadat nějak takhle:

<?
  
class lepsi_kalendar extends kalendar
  
{
    var
$zvyrazni_dny;
    
//atd.
  
}
?>

Kde se v našem kalendáři tvoří obsahy jednotlivých buněk? Tvoří se v metodě Bunka(). A právě tuto metodu bude naše nová třída implementovat lepším způsobem než ta původní. Půjde se na to tak, že se prozkoumá pole $zvyrazni_dny, a jestliže se v něm najde číslo, které chceme právě vepsat do buňky, napíše se větším písmem a tučně. Pavel Kácha v seriálu o HTML nám vysvětlil jak na to, takže to bude maličkost. V následujícím kódu si všimněte, jak jednoduše se dceřiné třídy píší:

<?
  
class lepsi_kalendar extends kalendar
  
{
    var
$zvyrazni_dny;
    function
Bunka ($radek, $sloupec, $PrvniDen, $PocetDnu)
    {
      
$dny=Array(1=>"Po", "Út", "St", "Čt", "Pá", "So", "Ne");
      if (
$sloupec==1) return $dny[$radek];
      
$chcivratit = ($sloupec-2)*7 + $radek - $PrvniDen+1;
      if (
$chcivratit<1 || $chcivratit>$PocetDnu) return "&nbsp;";
      else
      {
        if (
in_array($chcivratit, $this->zvyrazni_dny))
        return
"<B><BIG>".$chcivratit."</BIG></B>"; else return $chcivratit;
      }
    }
  }

  
$muj_kalendar= new lepsi_kalendar;
  
$muj_kalendar->mesic=7;
  
$muj_kalendar->rok=2004;
  
$muj_kalendar->zvyrazni_dny = Array(1,7,8,13,26);
  
$muj_kalendar->vypis();
?>

Ukázat skript | Spustit skript

Kód jako takový si vyžadá jeden komentář a tím je použití funkce in_array, o níž jsme zatím nemluvili. Je to na pochopení jednoduchá funkce - vrátí TRUE, pokud je daná hodnota (v našem případě $chcivratit) v daném poli (v našem případě $this->zvyrazni_dny). Pokud tam ten den je, vrátíme jako obsah buňky zvýrazněný text, pokud ne, vrátíme text normální.

Daleko zajímavější je, jak funguje celý skript. Protože třída lepsi_kalendar rozšiřuje třídu kalendar, dědí z této rodičovské třídy všechno, co sama nedělá jinak. Tak například dědí vlastnosti mesic a rok, a dědí rovněž metodu vypis. Co nedědí je metoda Bunka, protože tu si upravuje k obrazu svému. Je tedy jasné, že děděním můžeme získat řadu tříd, které rozšiřují možnosti nějaké základní třídy.

To, co jsme uvedli nejsou všechny možnosti, které PHP pro práci s objekty nabízí. Například existuje sada funkcí pro práci s objekty a  několik dalších možností při jejich vytváření. Co bychom ale určitě vědět měli je skutečnost, že práce s objekty v PHP přináší svá úskalí.

PHP, objekty a úskalí

PHP nemá privátní metody. To znamená, že v našem případě například neexistuje způsob, jak zabránit tomu, aby se dala zavolat metoda Bunka zvnějšku třídy, ačkoli je to metoda prospěšná pouze třídě jako takové a okolní svět by o ní vůbec nemusel vědět. Odborně se principu, kdy je implementace metody ukryta říká zapouzdření.

PHP zbaští nedeklarované atributy. To může být hotová katastrofa. Následující kód například bohužel bude fungovat přesto, že stupidni_trida atribut $b vůbec nedeklaruje:

<?
class stupidni_trida
{
  var
$a;
}

$moje_trida=new stupidni_trida;
$moje_trida->b=3;
echo
$moje_trida->b;
?>

V PHP je neintuitivní přiřazování objektů. Co myslíte, že bude výsledkem následujícího skriptu?

<?
class stupidni_trida
{
  var
$a;
}

$prvni_trida=new stupidni_trida;
$prvni_trida->a=1;

$druha_trida=$prvni_trida;
$druha_trida->a=2;

echo
$prvni_trida->a; // není 2 ale 1
?>

Rovnítko (bohužel) nezpůsobí vytvoření odkazu na objekt, ale vytvoření kopie objektu. Na to je třeba myslet.

Zda a jak budete v PHP používat objekty je samozřejmě na Vás. Níže je ješě několik věcí a postřehů k objektům a PHP, které byste měli znát:

  • Mnoho hotových knihoven a částí kódů PHP objekty používá
  • Můžete klidně mít jen jednu "úroveň" objetů bez dědičností
  • Objekt může existovat bez metod, jen s atributy. Ale někdy je pak lepší použít pole.
  • Někdo zase v PHP pro "přiřazení" každého atributu vytváří metodu nebo metody
  • Při použití objektů platí více než kdy dříve, že byste si měli vymyslet a dodržovat konvence (třeba, někdo začíná metody, které by se neměly volat zvnějšku objektu podtržítkem)
  • PHP 5 bude některé vlastnosti objektů měnit. K lepšímu, jistá omezení uvedená výše by mohla padnout. Více o tom bude v dokumentaci.

V dalším díle našeho seriálu opustíme OOP a podíváme se, jaké možnosti máme v PHP pro rozdělování zdrojových kódů do více fyzických souborů a jejich načítání.

Verze pro tisk

pridej.cz

 

DISKUZE

Zvýraznění dnešního dne 3.2.2006 17:43 Petr Chromý
L Re: Zvýraznění dnešního dne 4.2.2006 12:57 Petr Zajíc
undefined function 6.2.2007 21:25 Jiří Šturala
L Re: undefined function 7.2.2007 07:09 Petr Zajíc
vypis() 15.4.2008 23:27 Josef Jozka
L Re: vypis() 16.4.2008 00:37 Aleš Hakl
&quot;neintuitivní přiřazování objektů&quot; 11.7.2009 12:59 Daniel Kohout
  L Re: &quot;neintuitivní přiřazování objektů&quot; 11.7.2009 13:02 Daniel Kohout




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

8.1.2017 17:51 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 19. ledna od 18:30 v pražském hackerspacu Brmlab. Tentokrát je tématem srazu ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. K vidění bude mechanická klávesnice dasKeyboard, trackball Logitech nebo grafický tablet (a velký touchpad) Wacom. Přineste i vy ukázat svoje zajímavé klávesnice a další HW. V 18:20 je sraz před budovou, v 18:30 jdeme společně dovnitř, je tedy dobré přijít včas. Podle zájmu se později přesuneme do nějaké restaurace v okolí.
Přidat komentář

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

27.8.2016 8:55 /Delujek
Dnes po 4 letech komunitního vývoje vyšla diaspora 0.6.0.0
diaspora* je open-source, distribuovaná sociální síť s důrazem na soukromý
Více v oficiálním blog-postu
Přidat komentář

24.8.2016 6:44 /Ondřej Čečák
Poslední týden CFP LinuxDays 2016; pokud byste rádi přednášeli na LinuxDays 2016 8. a 9. října v Praze, můžete svůj příspěvek přihlásit, následovat bude veřejné hlasování.
Přidat komentář

9.8.2016 22:56 /Petr Ježek
Zařazení souborového systému reiser4 do jádra 4.7 znamená konečně konec patchování jádra jen kvůli možnosti použít reiser4.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

18.1.2017 20:18 / martin horky
Spolupraca linuxu a microsoftu

17.1.2017 9:57 / Pavel Hrubeš
Re: Externí USB televizní karta

4.1.2017 11:24 / Marcum
extension to house

3.1.2017 10:09 / bolden
country cottages

4.12.2016 22:54 / František Kučera
Dárek

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze