Definovanie triedy a vytvorenie objektu
Ako sme si ukázali na záver prvej prednášky tohto semestra, pre používanie OOP si musíme nadefinovať triedu spoločných objektov, ktorej určíme jej premenné a funkcie. Deklarácia takejto triedy je v podstate opis jej objektov, každý objekt (inštancia) danej triedy bude v sebe tieto prvky automaticky obsahovať a bude možné cez tento objekt k premenným pristúpiť a takisto volať dané funkcie. My si postupne budeme isté časti kódu v súbore index.php (Domov) prepisovať, pre jednoduché pochopenie a ukážku začneme s pripojením do databázy.
Zakomentujte si teda kód pre pripojenie do databázy (od komentára o pripojení po podmienku, kde testujeme, či sme sa pripojili). My by sme si mali teraz nadefinovať triedu, ktorá bude slúžiť pre manipuláciu s databázou (v našom prípade zatiaľ iba pripojenie do databázy), čiže objektom tejto triedy bude databáza. Trieda sa definuje slovom class (trieda), za ktorým nasleduje názov triedy začínajúci veľkým písmenom (dobrý zvyk), za ktorým nasledujú množinové zátvorky. Obsahom týchto zátvoriek bude deklarácia premenných a funkcií, ktoré potrebujeme. Na začiatok by to teda mohlo vyzerať takto:
index.php (začiatok kódu, nové pripojenie do DB):
//TRIEDA DATABAZA (pripojenie)
class Database{
}
V tele deklarácie triedy by sme mali nadefinovať všetky premenné, ktoré potrebujeme pri práci s objektom tejto triedy, resp. ktoré by danú triedu popisovali. Tým, že tieto premenné túto triedu popisujú, sa nazývajú ako jej vlastnosti (properties) alebo atribúty (attributes). Ak by sme mali napríklad triedu, ktorá by mala reprezentovať počítače (class Pocitac), tak by sme mohli mať properties s názvami ako typ_procesora, uhlopriecka, farba, znacka, model a podobne... Otázka je, čo potrebujeme pre našu databázu? Čo bude popisovať našu databázu? No mali by to byť v podstate tie isté premenné, ktoré sme potrebovali pre pripojenie sa do databázy, takže názov databázového servera, prihlasovacie meno a heslo a názov databázy. Objekt tejto triedy bude teda obsahovať tieto properties, ktoré ho budú popisovať.
Properties sa definujú slovom Public (verejné), za ktorým nasleduje štandardná deklarácia premennej, čiže znak dolára ($) a názov premennej a následne priradenie hodnoty. Slovo Public označuje, že táto premenná bude verejná, takže k nej budeme môcť pristupovať zvonka. Existujú ešte ďalšie dva typy, tým sa ale budeme zaoberať neskôr, teraz budeme používať iba public... Deklarácia našich properties by teda mohla vyzerať nasledovne:
index.php:
//TRIEDA DATABAZA (pripojenie)
class Database{
//properties
public $server_name = 'localhost';
public $login_name = 'root';
public $login_password = 'root';
public $db_name = 'zapr_db_1';
}
Tak ako sme si povedali, iba sme zadali deklaráciu premenných tak ako predtým s pridaním slova public pred každú deklaráciu. Tieto properties popisujú našu triedu, ich hodnoty určujú, čo je to za triedu, teda čo je to za databázu.
Aby sme sa do databázy pripojili, musíme vykonať funkciu (príkaz) mysqli_connect. Aby tento príkaz nebol len tak voľne v kóde pohodený, bude sa nachádzať vo funkcii. Takže si v tejto našej triede zadeklarujeme funkciu, ktorá bude slúžiť na pripojenie do databázy. Takéto funkcie sa nazývajú metódy (methods), sú to metódy danej triedy. Keďže pripojenie do databázy súvisí s objektom databáza, bude to jej vlastná metóda (metóda triedy databáza). V prirovnaní pre počítač by sme mohli mať metódy ako zapnutPocitac, vypnutPocitac, restartovatPocitac a podobne.
Deklarácia funkcií v triedach vyzerá rovnako ako predtým, čiže function-meno-zátvorky s parametrami atď. Ako parametre príkazu mysqli_connect použijeme naše štyri properties tejto triedy. Tu ale nastáva zmena. K properties triedy priamo v triede nepristupujeme iba zadaním ich názvu (napr. $server_name), ale cez kľúčové slovo this (toto, tento objekt), ktoré určuje akokeby aktuálnu inštanciu danej triedy – aktuálny objekt. Ako sme si povedali, každý objekt tejto triedy obsahuje všetky properties a metódy, takže takto pristúpime akokeby cez daný objekt k danej property. Za slovom this nasleduje pomlčka a otvorený zobáčik (->), čím pristupujeme k metódam a properties. Samozrejme si výsledok príkazu mysqli_connect vrátime cez slovo return, aby sme vedeli, či sme sa pripojili alebo nie. Mohlo by to teda vyzerať takto:
index.php (pridaná metóda do deklarácie triedy za properties:
...
function connectToDb(){
return mysqli_connect($this->server_name, $this->login_name, $this->login_password, $this->db_name);
}
...
Tak ako sme si povedali, k properties aktuálnej triedy (jej objektu) v deklarácii triedy pristupujeme cez kľúčové slovo this, ktoré reprezentuje aktuálnu triedu. Vyzerá to tak, že máme všetko čo potrebujeme, máme properties, ktoré popisujú databázu a máme funkciu, ktorá by nás do nej mala pripojiť. Teraz nám stačí konečne vytvoriť objekt tejto triedy a použťi jeho metódy alebo properties tak, ako to je nutné. To sa už samozrejme vykonáva mimo deklarácie triedy, hocikde a hocikoľkokrát v kóde programu. Objekt sa vytvára pomocou príkazu new (nový), za ktorým nasleduje názov triedy, ktorej objekt chceme vytvoriť ukončený okrúhlymi zátvorkami s parametrami (k tomu sa dostaneme neskôr). Toto vytvorenie objektu si priradíme normálne do nejakej premennej, ktorá bude následne predstavovať objekt našej triedy. Cez pomlčku a otvorený zobáčik vieme potom pristupovať k properties a metódam. My si teda vytvoríme objekt triedy Database, zavoláme metódu na pripojenie do DB a podľa odpovedi vypíšeme hlášku (tak ako predtým). Mohlo by to vyzerať takto:
index.php:
$db = new Database();
$connection = $db->connectToDb();
if (!$connection) {
echo 'Spojenie s databázou sa nepodarilo nadviazať.';
}else{
//echo 'Spojenie s databázou sa podarilo úspešne nadviazať.';
}
Ako vidíte, naša premenná $db reprezentuje objekt triedy Database. Na druhom riadku sme si do premennej (tak ako predtým) priradili výsledok pripojenia do db cez zavolanie metódy connectToDb. Ako vidíte, naša stránka vyzerá presne ako predtým, len sme práve pripojenie do databázy urobili objektovo. Keď už teraz uvidíte pomlčku a zobárik alebo definovanie nejakej class, budete už vedieť, čo to znamená. Dúfam, že ste význam, resp. fungovanie tried pochopili, ak nie nevadí, ešte sa tomu ideme trošku povenovať, takže tomu budete len viac a viac chápať.