Na most jn a sava-borsa...
A fggvnyek hasznlata a PHP nlklzhetetlen s igen hasznos rszt kpezik. Segtsgkkel - ha az ismtld kdrszekre fggvnyt runk - sszetettebb kdonk jelentsen lervidthet, amit tetszs szerinti helyekrl hvhatunk meg. A PHP mindig rendelkezsre ll beptett fggvnyei is sok munktl kmlhetnek meg.
A fggvnyek nll kdrszletek, amik csak akkor futnak le, ha erre a meghvsukkal utastst adunk - de egy fggvnyt egy programon bell akr tbbszr is lefuttathatunk. Futsuk kzben a bemenetkn t kzlt adatokat feldolgozzk s az eredmnyt a kimenetre tovbbtjk. A teljes program a fggvnyt egy zrt doboznak tekinti, amivel a be- s a kimenetn keresztl kommunikl.
===> adat bemenet |
f g g v n y |
===> eredmny kimenet |
A fggvnyek alapvet szintaxisa edig gy nz ki:
<?php
function fuggvenyem(adat_bemenet)
{
... fggvny trzs ...
... itt dolgozza fel az adatokat ...
return kimenet; // a feldolgozs eredmnye megjelenik a kimeneten
}
?>
Kzel 4000 gyakrabban hasznlt fggvny elre definilt a PHP-ban, ezeknek teljes listjt a PHP kziknyv tartalmazza itt. Ugyanitt minden fggvny helyes hasznlatt is bemutatjk.
Specilis clra definilhat a programoz is fggvnyt. Tovbbiakban ezeken keresztl mutatjuk be a fggvnyek hasznlatt.
fel...
Felhasznl ltal definilt fggvnyek
Nzzk az elz pldnkat egy mkd fggvny kpben:
<?php
function fuggvenyem($bemenet)
{
$kimenet = $bemenet * 2; // itt csinl valamit a bemeneti adattal
return $kimenet; // az eredmny megjelenik a kimeneten
}
?>
Mit ltunk?
- A fggvnydeklarcit mindig a function szval vezetjk be.
- Ezutn megadjuk a fggvnynk nevt - fggvnyknt mg nem szerepl nevet vlasszunk a vltoznv kpzs szablyai szerint.
- Vgl egy kerek zrjel pr () tartalmazza a bemeneti adatokat.
- A fggvny kdjnak lefutsval keletkezett eredmnnyel fog a fggvny visszatrni a fggvnynk.
A fggvny csak akkor fog lefutni, amikor azt a programban valahol meghvjuk, pldul gy:
<?php
$a = 12;
print $a . " duplja: " . fuggvenyem($a);
?>
Ltjuk: itt hvjuk meg a fggvnyt, bemeneteknt megadtuk az $a vltozt, amit a fggvny bellrl mint bemeneti adatot lt. Lefut a kdja s az eredmnyt a return kifejezsbe teszi. Kvlrl a program ezt az rtket ltja azon a helyen, ahova a fggvnyt behelyettestettk (hisz azt mr megbeszltk hogy a fggvnyt a program egsze egy zrt dobozknt kezeli, nem lt bele).
A pldt mkds kzben is megnzheted itt (10/1. plda).
fel...
Bemeneti adatok
A fggvny a krnyezettl a bemenetn keresztl kapja meg a feldolgozand adatokat. Ezeket a fggvny neve utni kerek zrjel-pr kz kell berni. Bemeneti adatot nem ktelez megadni - ez esetben csak az res zrjelpr szerepel - illetve megadhat egy, vagy tbb bemeneti paramter is. Tbb paramter esetn azokat vesszvel kell elvlasztani. A bemeneti paramterek brmilyen adattpusak lehetnek.
Br a zrjeleket mindig ktelez kitenni, nhny beptett PHP fggvny azrt kivtel ez all. Pldul a print(), include() fggvnyek hasznlhatk zrjelekkel s anlkl is. (Ez azon kivtelek egyike is, ahol nem lehet tapasztalni a programnyelv mshol szigor logikjt.)
Habr alaprtelmezetten a fggvnynek tadott vltoz rtk msolata kerl a fggvny bemenetre s annak fggvnyen belli vltozsa nincs hatssal a vltoz eredeti rtkre, itt is mdunk van ettl eltrni. A mdszert korbban mr megismertk: a & jellel itt is hivatkozhatunk az eredeti vltozra. Ilyen esetben a vltoz fggvnyen belli mdosulsa hatssal lesz az eredeti vltoz rtkre is.
<?php
function fgv_extrakkal(&$string)
{
$string .= "s a szksges plusssz.";
}
$str = "Ez egy karakterfzr, ";
fgv_extrakkal($str);
print $str; // kirja: Ez egy karakterfzr, s a szksges plusssz.
?>
A pldt mkds kzben is megnzheted itt (10/2. plda).
A paramtereknek lehet alaprtelmezett rtke is. Ha nem adunk meg ilyen paramtert a fggvny hvsakor, akkor a annak lefutsakor az alaprtelmezett rtkkel fog szmolni.
<?php
function kavet_csinal ($tipus = "cappucino")
{
return "Csinlok egy pohr " . $tipus . "t. <br />\n";
}
print kavet_csinal (); // kirja: Csinlok egy pohr cappucinot.
print kavet_csinal ("espresso"); // kirja: Csinlok egy pohr espressot.
?>
A pldt mkds kzben is megnzheted itt (10/3. plda).
Az alaprtelmezett rtkkel rendelkez paramtereket a paramterlista vgre kell tenni:
function fuggvenyem($egy, $ketto, $harom = "hrom")
fel...
A fggvny visszatrsi rtke
A fggvny kimenetn megjelen rtket a fggvny visszatrsi rtknek nevezzk.
A fggvny az elvgzett mvelet eredmnyt a return kifejezs segtsgvel adhatja t a programnak a beilleszts helyn, de az eredmny jelentkezhet az egsz programon kvl is, pldul a print() segtsgvel (ami maga is egy fggvny) a paramtereknt megadott karaktersort kirja a kpernyre - azaz kzvetlenk a HTML kimenetre kldi - vagy akr fjlba r, kukit helyez el, vagy brmi mst csinl.
A return-al tadott visszatrsi rtk brmilyen tpus lehet.
A return elrsekor a fggvny tadja a vezrlst a program soron kvetkez rsznek. Ha nincs return utasts, akkor a fggvny kimeneti rtke az utols kirtkelt kifejezs rtke lesz.
Az albbi gyakorlatiasabb pldnak nincs return utastsa, a kimenetet a print() sagtsgvel a kpernyre kldjk.
<?php
function paros($bemenet)
{
if ($bemenet % 2 == 0)
print "A " . $bemenet . " pros szm. <br />\n";
else
print "A " . $bemenet . " pratlan szm. <br />\n";
}
paros(1);
paros(2);
paros(3);
paros(4);
?>
A pldt mkds kzben is megnzheted itt (10/4. plda).
Ha a fggvnynek referencival kell visszatrnie, akkor az & referencia opertort kell alkalmaznod a fggvny deklarskor s a a visszatrsi rtk megadsakor is.
<?php
function &referenciat_ad_vissza()
{
return &$valtozo;
}
$hivatkozas = &referenciat_ad_vissza();
?>
fel...
Vltozk hatkre a fggvnyben
Mr emltettk, alapelv, hogy a programunk szmra a fggvny egy nll egysg, egy "fekete doboz", ami csak a bemenetn s a kimenetn keresztl kommunikl a krnyzetvel.
Ennek a kvetkezmnye, hogy a program kvlrl nem ltja a fggvnyen bell ltrehozott vltozkat, a bemenetn beadott vltozk mdostsait. Igaz viszont, hogy a fggvnyen bellrl sem ltszanak a programkrnyezet kls vltozi. Ez a jellemz sokszor jl jhet, mert nem kell gyelnnk a klnbz fggvnyekben s az egsz programban lv azonos nev vltozk tkzsre.
A global kolcssz:
Nha azonban jl jnne, ha bizonyos vltozkat mgis el lehetne rni a fggvnyen bell is.
Erre talltk ki a global kulcsszt, mint kivtel-kezelst. A problma szemlltetsre nzzk meg ezt a pldt:
<?php
function korod()
{
print "1-letkorod: " . $kor . " v.\n";
}
$kor = 15;
print korod();
?>
A kd eredmnye itt lthat (10/5. plda).
Amint ltjuk, nem ltunk semmit. Azaz a fggvny nem ltja a $kor vltozt, mert az a fggvnyen kvl van. De ha hasznljuk a global kulcsszt, mindjrt megjavul a kdunk:
<?php
function korod2()
{
global $kor;
print "2-letkorod: " . $kor . " v.\n";
}
$kor = 15;
print korod2();
?>
Nzzk meg ezt is (10/6. plda).
A magyarzat egyszer: a global kulcsszval globliss tettk a fggvnynk szmra a megnevezett krnyezeti helyi vltozt. Tbb vltozt is felsorolhatunk a global kulcssz utn egymstl vesszvel elvlasztva ket.
A globlis s szupergloblis vltozk (ilyenek pldul a $_GET, $_POST, $_COOKIE...) elrhetk a global kulcssz nlkl is.
A static kulcssz:
A fggvny minden hvsa kezdetekor egy alaphelyzetbl indul. Ha egy programban tbbszr hvjuk meg ugyanazt a fggvnyt, elfordulhat, hogy szksgnk lenne a legutols futskor felvett llapot megrzsre, pldul, ha valamit megszmolunk.
Erre knl a PHP egy kiegszt lehetsget, a static kulcsszval. A trolni kvnt adatot megjegyzi s a fggvny kvetkez futsakor nem az alaprtelmezettel, hanem az utoljra belltottal fog szmolni.
Az albbi pldban bekezdseket fogunk sorszmozni ezzel a mdszerrel.
<?php
function szamozott_sorok($szoveg)
{
static $hivasok_szama = 0; // alaprtelmezett rtk
$hivasok_szama++; // nveljk eggyel
print $hivasok_szama.". sor - ".$szoveg."<br />\n";
}
// a fggvnyt tbbszr is meghvjuk:
szamozott_sorok("valami szveg");
szamozott_sorok("akrmi stveg");
szamozott_sorok("brmi szveg");
?>
Fejezetnk utols pldjt itt lthatjuk mkds kzben. (10/7. plda).
|