Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

PHP v objetí objektů (2)

V dnešním pokračování nás čekají definice konstruktoru a metod. Vytvoříme také první skutečný objekt.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Minule jsme začali vytvářet třídu Menu, dnes v tom budeme pokračovat.

Konstruktor

Dalším krokem bude definice metod. Každá třída by měla (ale nemusí!) obsahovat jednu speciální metodu, která se nazývá konstruktor. Konstruktor je metoda, která má stejný název jako samotná třída. Její kód se automaticky spouští při vytváření nového objektu, je proto velice vhodná pro různé inicializační algoritmy. Náš konstruktor bude přebírat jeden (nepovinný) parametr – pole položek menu (klíčem je název odkazu, hodnotou pak URL). Defaultně se konstruktoru předá prázdné pole.

class Menu {
  # definice atributů...

  function Menu($polozky = array()) {
    reset($polozky);
    while (list($nazev, $url) = each($polozky)) {
      $this->nazvy[] = $nazev;
      $this->adresy[] = $url;
    }
  }
} 

Metoda vypadá stejně jako obyčejná funkce, až na to, že je napsána uvnitř definice třídy.

Asi jste si všimli zvláštního identifikátoru $this. Když definujeme třídu, ještě nevíme, jak se budou různé instance (konkrétní objekty) jmenovat. Uvnitř definice třídy proto používáme $this, což znamená něco jako „tento objekt“ – PHP pochopí, že chceme přistupovat k atributům objektu, se kterým právě pracujeme. Použití identifikátoru $this je povinné. Kdybychom jej vynechali a psali pouze $polozky = $pole (jako se to může dělat třeba v C++), hodnota parametru $pole by se uložila do lokální proměnné $polozky metody Menu() a ne do atributu objektu.

Objekt

V tomto okamžiku už máme vytvořenou plnohodnotnou třídu, kterou můžeme instanciovat neboli vytvořit podle ní skutečný objekt:

$hlavni_menu = new Menu(array('Úvod'  => 'index.html',
                              'Obsah' => 'toc.html',
                  'Jedna' => '1.html'));

$dalsi_menu = new Menu();
  # nebo: $dalsi_menu = new Menu; 

K vytvoření nové instance objektu slouží operátor new. Za ním následuje název třídy a v závorkách seznam parametrů, které se předají konstruktoru. Pokud konstruktoru nepředáváte žádný argument, můžete dokonce závorky za názvem třídy vynechat. V ukázce jsme vytvořili dva objekty: $hlavni_menu a $dalsi_menu. Každý má své vlastní hodnoty atributů, jak se můžete přesvědčit pomocí tohoto kódu:

$hlavni_menu->podklad = "#33FF33";
print 'Hlavní menu: ' . $hlavni_menu->podklad . '. ';
print 'Další menu: ' . $dalsi_menu->podklad . '.'; 

První print vytiskne číslo barvy "#33FF33", kdežto druhý standardní hodnotu  "#FFFF00".

Poznámka: K vytvoření objektu není definice konstruktoru třídy nutná. Jinými slovy třídy, podle kterých se pomocí operátoru new vytvářejí objekty, nemusí mít žádný konstruktor. Je ale dobré, když ho mají.

Metody

Prozatím nám to, jak Menu vypadá, nepřináší nic převratného. Objekty bez metod specifikujících jejich chování jsou takřka k ničemu. Je to jenom obyčejný datový typ záznam, k jehož implementaci žádné objekty nepotřebujeme – vystačili bychom si s asociativními poli. Pojďme tedy Menu nějak vylepšit:

class Menu {
  # definice atributů a konstruktoru...

  # vložení nové položky menu
  function vloz($nazev, $url) {
    $this->nazvy[] = $nazev;
    $this->adresy[] = $url;
  }

  # zobrazení jedné položky menu
  function zobrazPolozku($x) {
    print '<A HREF="' . $this->adresy[$x] . '">'
       . $this->nazvy[$x] . '</A><BR>';
  }

  # vypsání menu na stránku
  function zobraz() {
    print '<TABLE BGCOLOR="' . $this->podklad . '" BORDER=0>';
    print '<TR><TD>';
    for ($x = 0; $x < count($this->adresy); $x++) {
      $this->zobrazPolozku($x);
    }
    print '</TD></TR></TABLE>';
  }
}

$hlavni_menu = new Menu();
$hlavni_menu->vloz('Obsah', 'toc.html');
$hlavni_menu->vloz('Jedna', '1.html');
$hlavni_menu->zobraz(); 

Vytvořili jsme další tři metody. Funkce vloz() vkládá do menu novou položku. Metoda zobraz() je v celé třídě nejvýkonnější. Postará se o vytvoření menu na WWW stránce. K tomu volá také další metodu, zobrazPolozku(). Důvod, proč jsem pro takovou jednoduchou akci vytvořil novou metodu, se vyjeví v některém z dalších pokračování.

Metody objektů se volají stejně, jako se přistupuje k atributům: za název objektu umístíme operátor -> a jméno volané metody (viz kód).

Proměnná $this se v metodách nahrazuje objektem, pomocí kterého jsme metody volali. (V tomto případě objektem $hlavni_menu.) Kdybychom provedli:

$dalsi_menu = new Menu;
$dalsi_menu->vloz('Odhlásit', 'logout.php'); 

nahrazovalo by se $this v metodě vloz() objektem $dalsi_menu.

No a tady je kompletní třída Menu:

class Menu {
  var $polozky;             # pole položek menu
  var $podklad = '#FFFF00'; # barva pozadí

  # konstruktor
  function Menu($pole = array()) {
    reset($polozky);
    while (list($nazev, $url) = each($polozky)) {
      $this->nazvy[] = $nazev;
      $this->adresy[] = $url;
    }
  }

  # vložení nové položky menu
  function vloz($nazev, $url) {
    $this->nazvy[] = $nazev;
    $this->adresy[] = $url;
  }

  # zobrazení jedné položky menu
  function zobrazPolozku($x) {
    print '<A HREF="' . $this->adresy[$x] . '">'
       . $this->nazvy[$x] . '</A><BR>';
  }

  # vypsání menu na stránku
  function zobraz() {
    print '<TABLE BGCOLOR="' . $this->podklad . '" BORDER=0>';
    print '<TR><TD>';
    for ($x = 0; $x < count($this->adresy); $x++) {
      $this->zobrazPolozku($x);
    }
    print '</TD></TR></TABLE>';
  }
} 

Poznámka: U názvů atributů, stejně jako u ostatních proměnných PHP, záleží na velikosti písmen v identifikátorech. Atributy $obj->Hodnota a $obj->hodnota jsou tedy dva různé prvky.

Není tomu tak ale u názvů samotných tříd a metod. Třídy Trida a trIDA jsou pořád jedna a tatáž, stejně jako metody mojeMetoda() a MojeMETODA().

davame_internetu_obsah
       

Trochu nezvyklé pravidlo, není-liž pravda? Pozor na něj!

Pokračování příště…

Michal Burda

Michal Burda

Michal Burda vystudoval informatiku a aplikovanou matematiku a nyní pracuje na Ostravské univerzitě jako odborný asistent. Zajímá se o data mining, Javu a Linux.

Školení: Linux – Zálohování, Vysoká dostupnost, SNMP dohled

Na třídenním školení se naučíte nainstalovat a spravovat systém zálohování, replikace dat a vysoké dostupnosti dat. Dále také pracovat s RAID a LVM poli a nainstalovat a spravovat si vlastní dohledový systém.

Podrobnější informace a přihláška

Ohodnoťte jako ve škole:
Průměrná známka 2,55

Přehled názorů

jenom drobnustka ;-)
noname2 5. 8. 2001 02:56
Nový
Je tam chybicka
Martin Kalina 14. 3. 2002 14:41
Nový
└ 
Re: Je tam chybicka
Robert Hartl 29. 6. 2009 12:52
Nový
Další z důkazů trapnosti oop
Praktik 19. 9. 2008 18:41
Nový
├ 
Re: Další z důkazů trapnosti oop
anonymní uživatel 29. 10. 2008 20:33
Nový
│
└ 
Re: Další z důkazů trapnosti oop
Václav Makeš 29. 10. 2008 20:34
Nový
│
 
├ 
Re: Další z důkazů trapnosti oop
lolek 28. 11. 2008 10:42
Nový
│
 
└ 
Re: Další z důkazů trapnosti oop
martin cevora 28. 11. 2010 18:49
Nový
├ 
Re: Další z důkazů trapnosti oop
johnny 28. 10. 2009 18:37
Nový
├ 
Re: Další z důkazů trapnosti oop
Martin Marada, DiS. 25. 2. 2010 22:35
Nový
└ 
Re: Další z důkazů trapnosti oop
Sergej 21. 11. 2010 16:05
Nový
Lenivost
Simon 31. 8. 2011 19:38
Nový
Efektivita OOP
Kuba 9. 5. 15:45
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem