Reklama

zonerbooks.cz | zoner.cz | czechia.com | regzone.cz | inshop.cz | inmail.cz | zonerpress.cz | zonerantivirus.com | zonerama.cz

interval.cz

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

19. 03. 2004 | Petr Heller | PHP | Komentáře: 3

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.


Reklama


Další aktuální články na interval.cz

Tematicky související články

Dejte vědět i ostatním o článku

Komentáře ke článku

Přidat nový komentář

Autor komentáře: Anonymní

Datum vložení: 20. Srpen 2010, 10:12:15

alert(10)
dobry :)

Martin

Autor komentáře: Martin

Datum vložení: 23. Květen 2011, 10:39:21

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

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

Autor komentáře: QNAP TS-239 Pro Turbo NAS a veřejná IP | NAS4y.NET (na PHP5.cz)

Datum vložení: 30. Listopad 2011, 02:21:18

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

Zpět na začátek komentářů | Zpět na začátek článku

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Zoner AntiVirus Free pro Android
zabezpečte si svůj smartphone, zdarma
Profesionální eshop Zoner inShop od 990 Kč.
Reklama
Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena, interval.cz dodržuje právní předpisy o ochraně osobních údajů. Powered by WordPress.