PHP pro pokročilé – pracujeme s třídami a objekty

19. března 2004

V předchozím článku jsme se naučili pár tipů pro práci s funkcemi, nyní vám předvedu odpovídající mechanismy pro práci s třídami a objekty. Na úvod si ale zopakujeme základy objektově orientovaného programování (OOP) v PHP.

Základy

Zkušenější čtenáři mi jistě prominou tento začátečnický úvod, ale pro pochopení následujících textů jsou tyto znalosti naprosto nezbytné. Předpokládám, že víte, co je to objektové programování a tak si hned vytvoříme třídu clsZarovka, která bude popisovat stav žárovky. Tu budeme moci rozsvítit a zhasnout. Stav žárovky je uložen v proměnné Sviti.

class clsZarovka{ //vytvoříme si třídu clsZarovka
 var $Sviti; //této proměnné se říká členská proměnná, lze ji použít pouze ve třídě clsZarovka
 function Rozsvit() { //této funkci se říká členská funkce a lze ji použít také pouze ve třídě Zarovka
  $this->Sviti=true;
 }
 function Zhasni() { //toto je také členská funkce
  $this->Sviti=false;
 }
}

Objekt (instanci) vytvoříme následovně:

$Zarovka = new clsZarovka;

S tímto objektem poté můžeme pracovat, tedy volat jeho členské funkce ($Zarovka->Rozsvit();) nebo měnit členské proměnné ($Zarovka->Sviti = true;).

Kontruktor

Konstruktor je funkce, která má stejný název jako třída a která se při inicializaci třídy okamžitě provede. Používá se hlavně k počátečnímu nastavení proměnných třídy. Vytvořme si konstruktor naší třídy clsZarovka:

class clsZarovka {
  .
  .//kod z předešlého příkladu
  .
  function clsZarovka ($stav) { //zde je náš konstruktor
   $this->Sviti=$stav; //nastavení členské proměnné
  }
}

Třídu pak voláme takto:

$nasetrida=new clsZarovka(true); //při inicializace hned můžeme nastavit potřebné členské proměnné

Dědičnost

Pomocí dědičnosti můžeme vytvořit třídu, která „zdědí“ proměnné a funkce nějaké jiné třídy. Pro dědění používáme klíčové slovíčko extends. V dalším příkladu si rozšíříme třídu clsZarovka o nové členské funkce a proměnné:

class clsLepsiZarovka extends clsZarovka {
  var $Barva, $Jas;
  function NastavBarvu($b) {
   $this->Barva=$b; //nastavení členské proměnné
  }
  function NastavJas($j) {
   $this->Jas=$j; //nastavení členské proměnné
  }
  function clsLepsiZarovka ($s,$j,$b) {
   $this->Sviti=$s; //nastavení členské proměnné
   $this->Barva=$b; //nastavení členské proměnné
   $this->Jas=$j; //nastavení členské proměnné
  }
}

A nyní si vytvořme instanci této třídy:

$SuperZarovka = new clsLepsiZarovka(true, „yellow“,“2″);
$SuperZarovka->Rozsvit(); //zde například vidíte volání funkce zděděné od rodičovské třídy

Přímé volání funkce ve třídě

Doufám, že jste si osvěžili základy OOP v PHP a že se rádi podíváte na zajímavější operace s našimi třídami. V PHP můžeme zavolat funkci v libovolné třídě, aniž bychom tuto třídu dříve inicializovali. Ukážeme si to na následující kódu:

class trida {
  function funkce() {
    echo „Funkce spuštěna“;
  }
}

Jestliže chceme spustit funkci obyčejným zápisem funkce(); vypíše se známá chyba „Call to undefined function – volána nedefinovaná funkce“. Spuštění funkce musíme tedy provést jinak:

trida::funkce();

Všimněte si dvou dvojteček. Tento zápis říká, že se má vykonat funkce funkce() třídy trida.

Funkce pro práci s třídami a objekty

Pomocí speciálních funkcí můžeme zjišťovat počet metod a proměnných libovolné třídy, zjišťovat předka nebo potomka a další informace o našich třídách.

call_user_method(), method_exists()

Pomocí funkce call_user_method() můžeme zavolat funkci určité třídy. Funkce má dva povinné parametry, název volané funkce a jméno objektu, nepovinným parametrem pak jsou parametry volané funkce. Pomocí method_exists() můžeme zjistit, zda volaná funkce skutečně v objektu existuje. Této funkci se také zadávají dva povinné parametry, jméno objektu a jméno volané funkce. Jestliže volaná funkce v objektu existuje, method_exists() vrátí „TRUE“, jinak „FALSE“.

<?
class trida {
  function a() { echo „funkce a“; }
  function b() { echo „funkce b“; }
}
$objekt= new trida; //vytvoření instance třídy
$volanafce=“a“; //jméno funkce, kterou chceme spustit pomocí call_user_method().
if (method_exists($objekt,$volanafce)) { //zde zkontrolujeme existenci volané funkce. Zkuste zadat třeba „c“ a vypíše se chyba, protože funkce c() neexistuje
  call_user_method ($volanafce, $objekt); //když existuje, spustíme ji
} else {
  echo „Funkce “ . $volanafce . “ neexistuje.“; //jinak vypíšeme chybu
}
?>

get_class(), get_parent_class(), is_subclass_of()

Funkce get_class() vrátí jméno třídy, jíž je objekt instancí. Funkce get_parent_class() vrátí název rodičovské třídy zkoumaného objektu. Obě funkce mají jeden parametr, kterým je zkoumaný objekt. Funkce is_subclass_of() má parametry dva, a to objekt a třídu. Funkce vrátí „TRUE“, pokud zkoumaný objekt je instancí zděděné třídy od třídy zadané v parametru.

<?
class clsRodic { } //rodičovská třída
class clsDite extends clsRodic{ } //zděděná třída
//vytvoření instancí tříd clsRodic a clsDite
$rodic = new clsRodic;
$dite = new clsDite;
echo get_class($dite); //vypíše se text „clsDite“
echo get_class($rodic); //vypíše se text „clsRodic“
echo get_parent_class($dite); //vypíše se text „clsRodic“
echo is_subclass_of($dite, clsRodic); //funkce vrátí TRUE, protože $dite je instancí třídy clsDite, která je zděděná od clsRodic
?>

get_object_vars(), get_class_vars(), get_class_methods(), get_declared_classes(), class_exists()

A dostáváme se k poslední skupince. Funkce Get_object_vars() vrací pole vlastností objektu, get_class_vars() vrací pole vlastností třídy, get_class_methods() vrací pole názvů funkcí třídy, get_declared_classes() vrací pole názvů všech tříd, které jsou ve skriptu definovány (včetně systémových jako je například stdClass) a konečně class_exists() vrací „TRUE“, pokud daná třída existuje. Všechny funkce mají jeden parametr, kterým je zkoumaná třída nebo objekt.

Nyní si vytvoříme jednoduchou funkci, která nám vypíše informace o třídě, jejíž název zadáme jako parametr. Funkci si pojmenujeme InfoClass():

<?
function InfoClass($trida) {
 //jestliže zkoumaná třída neexistuje, napíšeme chybu
 if (!class_exists($trida)) {
   echo „Třída „.$trida.“ neexistuje!“;
 //jinak vypíšeme informace o třídě
 } else {
   $vlastnosti=get_class_vars($trida); //pole vlastností
   $funkce=get_class_methods($trida); //pole funkcí a metod
   $rodic= get_parent_class($trida); //zjistíme si rodiče
   echo „Název třídy: „.$trida.“<br />\n“;
   echo „Rodičovská třída: „.$rodic. „<br />\n“;
   echo „Počet vlastností: „.count($vlastnosti).“<br />\n“;
   echo „Počet funkcí: „.count($funkce).“<br />\n“;
   //vypsání jednotlivých funkcí a metod
   echo „Funkce a metody třídy „.$trida.“:“.“<br />\n“;
   foreach ($funkce as $fce) {
     echo “ – „.$fce.“<br />\n“;
   }
   //vypsání jednotlivých vlastností
   echo „Vlastnosti třídy „.$trida.“:“.“<br />\n“;
   foreach ($vlastnosti as $vl) {
     echo “ – „.$vl.“<br />\n“;
   }
 }
}
// třída pro testování
class clsTrida {
  var $vlastnost1=“vlastnost 1″;
  var $vlastnost2=“vlastnost 2″;
  var $vlastnost3=“vlastnost 3″;
  function funkce1() {}
  function funkce2() {}
  function funkce3() {}
}
//nakonec voláme samotnou funkci
infoclass(clstrida);
?>

Výstup by měl vypadat asi takto:

Název třídy: clstrida
Rodičovská třída:
Počet vlastností: 3
Počet funkcí: 3
Funkce a metody třídy clstrida:
– funkce1
– funkce2
– funkce3
Vlastnosti třídy clstrida:
– vlastnost 1
– vlastnost 2
– vlastnost 3

Jestliže chcete zobrazit informace o všech třídách ve skriptu, můžete použít již zmiňovanou funkci get_declared_classes() v kombinaci s naší funkcí InfoClass():

<?
//funkce InfoClass z minulého příkladu
function InfoClass($trida) {
 .
 .
 .
}
//získáme pole, které obsahuje všechny třídy ve skriptu
$tridy=get_declared_classes();
//vypíšeme informace o každé třídě v poli
foreach ($tridy as $trida) {
 infoclass($trida);
 echo „<br />\n“; //mezera mezi výpisem jednotlivých tříd
}
?>

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

4 komentářů

  1. Anonym

    Srp 20, 2010 v 10:12

    alert(10)
    dobry :)

    Odpovědět
  2. Martin

    Kvě 23, 2011 v 10:39

    vše o třídách v PHP

    Odpovědět
  3. QNAP TS-239 Pro Turbo NAS a veřejná IP | NAS4y.NET (na PHP5.cz)

    Lis 30, 2011 v 2:21

    […] celkem samostaně osvojit si práci se síťovými prostředky, s databázemi (nejen s phpMyAdmin), PHP a vším […]

    Odpovědět
  4. Admin Blog | NAS4y.NET Admin Blog

    Lis 3, 2013 v 9:58

    […] celkem samostaně osvojit si práci se síťovými prostředky, s databázemi (nejen s phpMyAdmin), PHP a vším […]

    Odpovědět

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *