PHP – 41. díl – objekty podruhé

Dnešní díl bude vyhrazen opět objektům a třídám. Vzhledem k nesouhlasným diskusím k minulému dílu jsem se rozhodl okomentovat pár maličkostí.

Úvod

Původně jsem si pohrával s myšlenkou vůbec objekty do mého seriálu o PHP nezařadit. Důvodem je to, že PHP zdaleka není typicky objektový programovací jazyk a naprosto zásadní většina kódu se píše neobjektově. Výhody objektů se projeví zpravidla hlavně při velkých projektech, nebo při týmové práci. A je proto téměř nemožné představit výhody objektů na malé praktické ukázce.

Nakonec mi to nedalo, a rozhodl jsem se, že objekty ve svém seriálu popíši. Znalost objektového programování vás určitě obohatí.

Samotná myšlenka objektového programování je jednoduchá. Zatímco obyčejné programování používá proměnné a funkce, objektové programování používá objekty, které proměnné a funkce zapouzdřuje v jeden celek.

Hlavní výhodou objektového programování a objektů je fakt, že popisují věci tak, jak jsou v reálném životě. Například objekt typu zvíře má určité vlastnosti, například barvu, velikost, apod. Barvu zvířete, nebo jeho velikost bychom spolu s dalšími vlastnostmi popsali jako proměnné třídy zvíře. To znamená proměnné třídy nazvané $barva, $velikost, apod. A zvíře taky určité věci umí, například vydávat nějaké zvuky (to bychom popsali třeba funkcí vydej_zvuk), apod. V objektově orientovaném programování potom mluvíme o proměnných třídy jako o datových členech třídy a funkce potom nazýváme metodami třídy.

Koneckonců takový případ našeho zvířete můžeme snadno přepsat do PHP:

<html>
<head>
<title>Příklad 1. z 41. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
class zvire
{
  // Proměnné třídy zvire.
  var $barva = ``;
  var $velikost = 0;
  // Funkce třídy zvire.
  function vydej_zvuk()
  {
    echo `-<br>`;
  }
}
$objekt = new zvire;
$objekt->vydej_zvuk();
?>
</body>
</html>

V tomto našem příkladě jsme definovali třídu s názvem zvire. Tato třída má dvě proměnné, které definují barvu a velikost zvířete a také jednu metodu vydej_zvuk. Naše zvíře tedy umí vydat zvuk, ale protože zatím nevíme, jaké je to zvíře, tak naše metoda vydej_zvuk pouze vypíše pomlčku.

Konstruktor

Každá třída může, ale samozřejmě nemusí obsahovat funkci, která se jmenuje stejně jako třída samotná. Taková funkce má pak výsadní postavení a nazývá se konstruktor. Konstruktor se automaticky spustí při vytvoření objektu, tedy při vytvoření proměnné dané třídy.

Zde je příklad naší třídy s konstruktorem, který má dokonce 2 parametry, které rovnou nastavují barvu a velikost zvířete:

<html>
<head>
<title>Příklad 2. z 41. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
class zvire
{
  // Proměnné třídy zvire.
  var $barva = ``;
  var $velikost = 0;
  // Funkce třídy zvire.
  function vydej_zvuk()
  {
    echo `-<br>`;
  }
  // Konstruktor.
  function zvire($barva,$velikost)
  {
    echo `--volán konstruktor--<br>`;
    $this->barva = $barva;
    $this->velikost = $velikost;
  }
}
$objekt = new zvire(`černá`,30);
$objekt->vydej_zvuk();
?>
</body>
</html>

Jak je vidět, konstruktor slouží k počátečnímu nastavení stavu objektu. Náš konstruktor nejdříve vypíše hlášení, že byl volán konstruktor a potom nastaví barvu a velikost zvířete podle parametrů předaných konstruktoru.

Protože jsme v našem příkladě použili konstruktor se dvěma parametry, a protože konstruktor je automaticky volán při vzniku objektu, tedy při použití slova new, je nutné i tady dva parametry předat. Proto jsme v našem příkladu na tomto řádku předali dva parametry:

$objekt = new zvire(`černá`,30);

Dědičnost

Dědičnost je poměrně silná zbraň objektového programování. Umožňuje rozšiřovat objekty pomocí tohoto mechanismu dědičnosti. Stejně tak, jako ve skutečném světě potomci dědí některé vlastnosti po svých předcích, tak třídy dědí některé své vlastností od jiných tříd. Většinou se třídy při dědění „specializují“, například naší třídu zvíře můžeme využít jako základ pro třídy představující konkrétní zvířata, například kočku, nebo psa.

Takový pes určitě bude mít všechny vlastnosti jako každé zvíře, to znamená, že tyto vlastnosti podědí. A kromě vlastností každého zvířete bude mít určité vlastnosti navíc, které jsou typické pouze pro psy. A přesně toto je principem mechanismu dědičnosti v objektovém programování.

Zkusíme si tedy vytvořit třídu s názvem pes, která podědí vlastnosti třídy zvire. Mluvíme v objektovém programování o tom, že třída zvire je rodičem, nebo předkem třídy pes a třída pes je potom třídy zvire. V PHP naznačíme dědičnost slovem extense za jménem třídy:

<html>
<head>
<title>Příklad 3. z 41. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
class zvire
{
  // Proměnné třídy zvire.
  var $barva = ``;
  var $velikost = 0;
  // Vydej zvuk.
  function vydej_zvuk()
  {
    echo `-<br>`;
  }
}
class pes extends zvire
{
  // Zaštěkej.
  function vydej_zvuk()
  {
    echo `haf<br>`;
  }
}
$objekt = new pes;
$objekt->vydej_zvuk();
?>
</body>
</html>

V našem příkladu je tedy třída pes potomkem třídy zvire. Třída pes převzala všechny vlastnosti třídy zvire, a kromě toho změnila funkci vydej_zvuk(), protože každý správný pes má zaštěkat haf.

Diskuze (8) Další článek: Eurotel Data Expres dnes v noci nepojede

Témata článku: , , , , , , , , , , , ,