Funkcie s návratovou hodnotou, lokálne premenné
V minulej kapitole sme si ukázali, ako vieme do funkcií pomocou parametrov poslať akékoľvek informácie (dáta), s ktorými môžeme v danej funkcii pracovať alebo s ktorými pracujeme v celom programe. Na jednoduchom príklade s jedným parametrom sme si ukázali univerzálnu funkciu na oslovenie v texte. Ako sme si povedali, parametrov môže byť viac. Našu poslednú ukážku si troška upravíme a pridáme do nej viac parametrov, aby ste videli, ako to funguje:
<?php
//deklaracia premennych
$text = "Pozyvame Vas na skolenie programovania v jazyku PHP.";
$text2 = "Pozyvame Vas na skolenie programovania v jazyku PHP.";
function vypisOslovenie($jeToPan, $meno, $obsah){
if($jeToPan){
echo "Vazeny pan";
}else{
echo "Vazena pani";
}
echo " ".$meno.",";
echo "<br>";
echo "<br>";
// toto by vyhodilo chybu, pretoze nemame pristup k deklaracii premennej, nepozname ju
// echo $text;
echo $obsah;
}
vypisOslovenie(true, "Ander z Kosic", $text2);
vypisOslovenie(false, "Petra Polnisova", $text2);
Túto ukážku si troška rozoberieme a vysvetlíme si na nej ešte jednu vec ohľadom premenných, ktorej sme sa zatiaľ vyhli. Kým sme nepoužívali funkcie, deklarovali sme si premenné v programe a mohli sme ich v programe použiť na hociktorom mieste. Program, resp. kód ako taký vytvára od hora dole akokeby hlavnú oblasť/priestor/sféru (scope – dosah, rámec). Premenné deklarované v tomto priestore sú následne prístupné (môžeme ich použiť) v tejto oblasti. Vytváraním funkcie sa pre jej telo a jej premenné vytvára ale nový priestor, samostatný, ktorý je povedzme v pamäti uložený na inom mieste. Skorej sme si spomenuli, že deklarovaním premenných (určenie jej unikátneho názvu) vytvárame akokeby miesto v pamäti počítača, kde názov premennej ukazuje a tam sa aj ukladajú ich hodnoty. Tým, že funkcia má svoj vlastný priestor, nie je možné používať v programe, mimo funkcie, premenné, ktoré sú deklarované v jej tele a rovnako funkcia nemôže používať premenné, ktoré sú deklarované mimo nej. Je to preto, pretože oba priestory majú svoje vlatné miesto v pamäti a navzájom ho nezdieľajú, nevidia do seba, premenné sa nepoznajú medzi priestormi.
Z tohto dôvodu sa premenné, ktoré sa deklarujú vo funkcii (tie v tele a takisto argumenty – parametre), nazývajú lokálne premenné, pretože zahŕňajú iba daný priestor funkcie (lokál funkcie). Je možné v programe deklarovať tzv. globálne premenné, ktoré sú prístupné všade, preto ten názov, ale to si vysvetlíme neskôr... Nateraz nám to stačí vedieť a v prípade, že potrebujeme vo funkcii niečo z vonka, pošleme si to ako parameter. Vráťme sa k našej ukážke, na začiatku si teda deklarujeme dve premenné. Za deklaráciou funkcie ju voláme s tromi parametrami, okrem typu oslovenia si posielame aj meno osoby a premennú text2, v ktorej je uložený text, ktorý chceme zobraziť za oslovením. Všimnite si, že ako parameter nemusí byť len konkrétna hodnota, ale môže to byť aj premenná, ako argument sa potom posiela jej hodnota (jej obsah). Pozrite sa lepšie na telo funkcie. Ak by sme na konci funkcie chceli vypísať text pomocou premennej text, tak by nám program vyhodil chybu. Pretože sa snažíme pristúpiť k premennej, ktorá bola deklarovaná mimo funkcie, čiže v inom priestore. A funkcia táto premennú nepozná, nevie o nej, že existuje. Preto sme si premennú text2 poslali ako parameter, aby sme k nej mali prístup.
Veľmi často je nutné v programoch na viacerých miestach vykonať nejakú úpravu dát, napríklad zmeniť formát dátumu, vypočítať niečo na základe nejakej hodnoty a podobne. Pochopiteľne, aby sa daný kód neopakoval, na takéto úkony sa zvykne spraviť funkcia. Aby nám však funkcia zmenila hodnotu premennej, ktorú používame mimo funkcie, napríklad ten dátum alebo nejaké číslo, museli by sme špecifikovať globálne premenné alebo použiť nejakú inú metódu. Funkcie však majú okrem parametrov ešte jednu vymoženosť a to je to, že vedia vrátiť hodnotu. Čo to znamená? Doteraz sme si funkcie iba volali a po zavolaní sa vykonal kód deklarovaný v ich tele. Predstavme si ale prípad, že nám napríklad používateľ zadáva svoj počet rokov a my mu chceme vyrátať, koľko mu chýba do dôchodku. Spravíme si na to funkciu, do ktorej budeme posielať ako parameter počet rokov osoby. Po vyrátaní, koľko rokov chýba do dochodku však nechceme danú hodnotu iba vypísať, ale chceme ju mať prístupnú ďalej v programe (mimo funkcie) a pracovať s ňou. Ak ju však vložíme do premennej v tele funkcie, zvonka k nej prístup mať nebudeme, pretože to bude iba lokálna premenná v pamäťovom priestore danej funkcie.
Presne na toto existuje možnosť poslať hodnotu/premennú von z funkcie. Toto poslanie sa vykonáva pomocou slova return (return – vráť, vráti návratovú hodnotu), za ktorým nasleduje medzera a za ňou daná hodnota. Treba upozorniť, že ak program narazí na tento príkaz, funkcia sa okamžite končí a program z nej vyskočí a ide ďalej. Ak je ak kód – príkazy v tele funkcie za týmto príkazom, nikdy sa nevykonajú. Význam tohto pochopíme neskôr, je dobré to ale vedieť teraz. Otázka ešte znie, ako si tú návratovú hodnotu odchytíme mimo funkcie? Jednoducho, zavolanie funkcie obsahuje v sebe danú hodnotu, takže samotné zavolanie funkcie môžeme vypísať pomocou príkazu echo alebo ju priradiť do nejakej premennej. Poďme si to teda ukázať:
<?php
$vek_1 = 34;
function zistiPocetRokovDoDochodku($vek){
$vysledok = 62 - $vek;
return $vysledok;
// return 62 - $vek; //mohlo by byt aj takto bez pouzicita lokalnej premennej
}
echo "Pocet rokov je ".$vek_1." a do dochodku ostava ".zistiPocetRokovDoDochodku($vek_1); echo "<br>";
echo "Pocet rokov je 23 a do dochodku ostava ".zistiPocetRokovDoDochodku(23); echo "<br>";
$vysledok = zistiPocetRokovDoDochodku(56);
echo "Pocet rokov je 56 a do dochodku ostava ".$vysledok;
Všimnite si, že za slovom return môžu nasledovať aj operácie s premennými a hodnotami (zakomentovaná časť, skúste si to odkomentovať a výsledok bude rovnaký), ako návratová hodnota bude výsledok daného riadku/príkazov/operácií. Ale v našom prípade sme si výsledok uložili do lokálnej premennej a vraciam jej hodnotu. Následne v programe voláme funkciu a rovno ju aj vypisujeme v príkaze echo, najprv si posielame parameter premennú a potom priamo hodnotu. Na konci si výsledok zavolania funkcie priraďujeme do premennej a následne ju vypisujeme. Takto je možné zachytiť výsledok funkcie, jednoducho zavolanie automaticky obsahuje v sebe tú hodnotu, s ktorou môžeme pracovať – čiže priradiť alebo vypísať a podobne. Aby ste si nemysleli, funkciu môžeme stále iba zavolať, aby sa vykonalo jej telo a nemusíme návratovú hodnotu nijak zachytiť, kľudne ju môžeme iba zavolať ako predtým a jej return môžeme ignorovať.