14. diel - Tvorba vlastných funkcií v PHP
V predchádzajúcom cvičení, Riešené úlohy k 13. lekcii PHP, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 13. lekcii PHP , sme si predstavili a vyskúšali niekoľko funkcií pre prácu s textovými reťazcami. V dnešnom PHP tutoriále si ukážeme, ako vytvárať vlastné funkcie.
Tvorba vlastných funkcií
Zatiaľ sme len používali cudzie funkcie. Nie je však nič ťažké vytvoriť si funkciu vlastné. Rozdeľovanie skriptov do funkcií má nasledujúce výhody:
- Prehľadnosť - Ak sa nejaký algoritmus skladá z viacerých krokov, vytvoríme funkciu pre každý tento krok a funkcie potom voláme po sebe. Zoberme si napr. Náš emailový formulár z minulých lekcií. Ten zvalidoval či bolo všetko vyplnené a potom odoslal email. Všetko bolo napísané na jednom mieste a zamotané do seba. Správne by sme na danom mieste mali volať len funkciu pre validáciu a funkciu pre odoslanie. Každá funkcia potom obsahuje len to, čo do nej patrí. Kód sa stáva prehľadnejším.
- DRY (Neopakujme sa) - Skratka
DRY
označuje Nechcem Repeat Yourself, teda neopakujte sa. Ide o uznávaný programátorský princíp, ktorý odsudzuje duplikované kód. Ak chceme nejakú časť kódu použiť viackrát, nemusíme ju opisovať, ale oddelíme ju do funkcie. Potom len zavoláme jednu funkciu na viacerých miestach programu. Keď potom chceme v kóde niečo opraviť, nehľadáme chybu na niekoľkých miestach, ale opravíme ju len v tej jednej funkcii. - Možnosť použitia knižníc - Funkcie, ktoré často používate, môžete vkladať do samostatných súborov, ktorým sa niekedy hovorí knižnice (anglicky library). Ak si vytvoríte napr. Knižnicu pre prihlasovanie užívateľov, môžete ju potom len vložiť do iného projektu, načítať a začať používať danej funkcie, bez toho aby ste niečo znova programovali.
Pozn .: V ďalších seriáloch si ukážeme aj ako členiť funkcie do objektov. Dosiahneme tým naozaj veľmi čitateľného kódu, ktorý je možné navyše rozširovať.
Správny program by mal byť poskladaný z niekoľkých kratších funkcií, nemal by vyzerať ako dlhá rezance kódu
Jednoduchá funkcie
Vytvorme si úplne jednoduchú funkciu, ktorá len niečo vypíše. Funkciu
deklarujeme pomocou kľúčového slova function
. Za ním nasleduje
názov funkcie (ten by mal byť písaný v CamelCase) a zátvorky. Telo funkcia
je potom vložené do bloku zo zložených zátvoriek.
Funkcia by sa mala vymenovať podľa toho, čo robí. Mala by tiež robiť vždy len jednu vec a pokiaľ potrebujeme urobiť 2 veci, vytvoríme si na to 2 funkcie. Ako názov funkcie sa mi osvedčilo používať sloveso v rozkazovacom spôsobe (imperatívu). Akonáhle funkciu niekde deklarujeme, môžeme ju nižšie volať. Urobíme to jednoducho napísaním jej názvu a zátvoriek.
Nasledujúci kód vložíme kamkoľvek do PHP sekvencie:
{PHP}
function pozdrav()
{
echo('Vitajte na mojom webe');
}
pozdrav();
{/PHP}
výsledok:
Navrchu deklarujeme funkciu, nižšie hotovú funkciu zavoláme.
Funkciu musíme pochopiteľne vždy deklarovať nad miestom, odkiaľ ju voláme. PHP dekóduje zdrojový kód od začiatku do konca a ak by sme to urobili naopak, narazilo by na volanie funkcie, o ktorej si ešte "neprečítal".
Funkcie s parametrami
Funkciu samozrejme môžeme vložiť aj nejaké parametre. Na jednoduchom príklade si ukážme funkciu, ktorá vypíše súčet dvoch čísel. Takto triviálne funkciu by sme v praxi síce nedeklaroval, ale ako príklad poslúži dobre a reálnu funkciu si ukážeme na konci. Parametre vkladáme ako premenné do zátvorky v hlavičke funkcie a oddeľujeme ich čiarkou.
function secti($a, $b) { $soucet = $a + $b; echo("Súčet: $soucet"); }
Funkciu následne voláme takto:
{PHP}
function secti($a, $b)
{
$soucet = $a + $b;
echo("Súčet: $soucet");
}
secti(10, 20);
{/PHP}
Pri volaní funkcie môžeme do parametrov samozrejme vložiť i premenné:
$a = $_POST['cislo1']; $b = 20; secti($a, $b);
Z funkcií nemožno pristupovať k nejakej premennej, ktorá je definovaná
mimo funkciu. Vo funkcii môžete pristupovať len k premenným, ktoré prišli
v parametri a maximálne k superglobálním poliam, ako sú $_GET
a
$_POST
. Síce to ide obísť pomocou kľúčového slova
global
, ale to nerobte, pretože taká funkcia stráca zmysel. Keď
niečo nejde, má to väčšinou nejaký zmysel a nemali by sme hľadať
spôsob, ako obísť zákaz, ale ako to urobiť správne Všetko, čo funkcie potrebuje, jej
jednoducho odovzdáme vo vstupných parametroch.
Funkcie s návratovou hodnotou
Funkcia môže tiež vracať nejakú hodnotu. V ukážkach vyššie sme vo
funkciách len vypisovali. V praxi sa takéto funkcie príliš nepíšu, keďže
nie sú univerzálne. Predstavte si, že nechceme súčet vypísať, ale
použiť ho ako medzivýsledok pri ďalšom výpočtu. Preto funkcia
výslednú hodnotu väčšinou vracia. Tam, kde bola funkcia volaná,
si s ňou potom môžeme urobiť čo chceme. Funkcia môže vždy
vrátiť len jednu hodnotu a akonáhle ju vráti, tak sa na tom mieste
ukončí a ďalšie kód v nej sa už nevykoná. Hodnotu
vraciame pomocou kľúčového slova return
.
Ak potrebujeme vrátiť viac hodnôt, môžeme vrátiť pole, alebo si pre každú hodnotu vytvoriť samostatnú funkciu. Záleží na konkrétnom prípade.
Upravme našej sčítací funkciu tak, aby výsledok miesto vypisovania vracala:
function secti($a, $b) { $soucet = $a + $b; return $soucet; }
Funkciu by sme potom volali nasledovne:
{PHP}
function secti($a, $b)
{
$soucet = $a + $b;
return $soucet;
}
$soucet = secti(10, 20);
echo("Súčet: $soucet <br />");
echo("Dvojnásobok súčtu: " . ($soucet * 2));
{/PHP}
Vidíte, že keď naša funkcia hodnoty vracia, je úplne univerzálne a môžeme ju použiť ako k výpisu, tak k ďalšej práci. Výsledok môžeme neskôr uložiť napríklad do databázy, súboru, kamkoľvek.
Funkcie na odosielanie emailu
Ako veľmi užitočná funkcia je funkcia na posielanie emailov. Teraz máme už dostatok vedomostí na to, aby sme si takú funkciu napísali. Keď sa pozrieme späť na kód na odoslanie emailu v našom formulári, dáme dokopy nasledujúce funkciu:
function odesliEmail($adresa, $predmet, $odesilatel, $zprava) { $hlavicka = 'From:' . $odesilatel; $hlavicka .= "\nMIME-Version: 1.0\n"; $hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n"; $uspech = mb_send_mail($adresa, $predmet, $zprava, $hlavicka); return $uspech; }
Funkcia si pripraví hlavičku na základe vstupných parametrov a tú potom
odovzdá funkciu mb_send_mail()
, ktorá email odošle. Táto
funkcia vráti hodnotu 0
/ 1
podľa toho, či bolo
odoslanie úspešné alebo nie. Toto hodnotu potom vrátime aj našej
funkcií.
Volanie funkcie bude nasledujúci:
$uspech = odesliEmail('[email protected]', 'Test emailu', '[email protected]', 'Text správy'); if (!$uspech) echo('Email sa nepodarilo odoslať, skontrolujte adresu a odosielateľa');
Určite uznáte, že písať tých 5 riadkov, čo je teraz vo funkcii, na každom mieste, kde potrebujeme odoslať email, je minimálne zdržujúci a neprehľadné. Takto napíšeme len jeden riadok. Funkcia však funguje len v tom súbore, v ktorom je deklarovaná. V budúcej lekcii, Riešené úlohy k 14. lekcii PHP , si ukážeme, ako zabezpečiť, aby sme funkciu mohli používať úplne všade bez toho, aby sme ju opisovali.
V nasledujúcom cvičení, Riešené úlohy k 14. lekcii PHP, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.