PHP pro pokročilé – pracujeme s třídami a objekty
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.
Mohlo by vás také zajímat
-
Aktualizujete svoji .NET webovou aplikaci? Může se hodit app_offline.htm
10. července 2024 -
Moderní trendy ve webdesignu: Top trendy pro rok 2024
12. ledna 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024
Anonym
Srp 20, 2010 v 10:12alert(10)
dobry :)
Martin
Kvě 23, 2011 v 10:39vše o třídách v PHP
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 […]
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 […]