PHPPamokos.lt


11. Funkcijos ir jų kūrimas

Programuojant, dažnai atsiranda kodo gabalai, kuriuos reikia naudoti daugiau negu vieną kartą, o kai kuriuos - pakankamai pastoviai. Tada prasminga tokius gabalus suskirstyti į funkcijas, kad nereikėtų to paties kodo perrašinėti N kartų. Praktiškai, funkcija yra kodo eilučių rinkinys, turintis pavadinimą ir galintis turėti parametrus bei grąžinti kokią nors reikšmę.

Realiai, funkcijų pavyzdžius jau esame matę ne kartą: strlen(), array_slice() ar explode() - visa tai yra PHP vidinės funkcijos, tik šiame skyrelyje išmoksime kurti savo pačių funkcijas.

Kaip sukurti funkciją

Bendru atveju, funkcija sukuriama taip:

function SkaiciuSuma ($parametras1, $parametras2, $parametras3) {
  // funkcijos atliekami veiksmai
  $suma = $parametras1 + $parametras2 + $parametras3;
  if ($suma > 10) { echo $suma; }
  return $suma; // "return" - funkcijos grąžinama reikšmė
}

Iš šio pavyzdžio svarbiausi momentai:

  • Funkcija turi turėti pavadinimą. Jis gali būti jūsų sugalvotas, svarbiausia, kad jis nesutaptų su jau rezervuotais PHP funkcijų pavadinimais ir su jūsų pačių sukurtų kitų funkcijų pavadinimais.
  • Funkcija gali (bet neprivalo) turėti parametrus, jie rašomi skliausteliuose po pavadinimo, per kablelį. Jeigu parametrų nėra paduodama, rašomi tiesiog tušti skliausteliai ( ).
  • Funkcijos kodas rašomas tarp laužtinių skliaustų { ir }.
  • Funkcija gali (bet neprivalo) grąžinti rezultatą-kintamąjį, kuris turi būti nurodytas po kodinio žodelio return.
  • Kaip grąžinama reikšmė gali būti ne tik kintamasis-skaičius, gali būti ir teksto eilutė, ir masyvas.

Parodysime konkrečios ir prasmingos funkcijos pavyzdį. Sakykime, kad mums reikia funkcijos, kuri suskaičiuotų mokinio pažymių aritmetinį vidurkį ir išvestų tik tuos pažymius, kurie aukštesni už 8.

function Pirmunai($pazymiu_masyvas) {
  $suma = 0;
  for ($i=0; $i < count($pazymiu_masyvas); $i++) {
    if ($pazymiu_masyvas[$i] > 8) {
      echo $pazymiu_masyvas[$i] . " ";
    }
    $suma = $suma + $pazymiu_masyvas[$i];
  }
  // tikriname, ar masyvas ne tuščias, nes iš 0 dalinti negalima
  if (count($pazymiu_masyvas) > 0) {
    $vidurkis = $suma / count($pazymiu_masyvas);
  } else {
    $vidurkis = 0;
  }
  return $vidurkis;
}
 

Kaip iškviesti funkciją ir ją panaudoti

Na gerai, sukūrėme mes kelias funkcijas, dabar metas jomis pasinaudoti. Tai vadinama funkcijos iškvietimu, tam reikia parašyti funkcijos pavadinimą ir skliausteliuose nurodyti parametrus. Lygiai taip pat, kaip kviečiamos įprastinės PHP funkcijos, tokios kaip strlen() ar count().

Tiesa, nežinau ar pastebėjote, bet viso kurso eigoje jei kalbu apie funkciją, tai jos pavadinimą užrašau su skliausteliais. Tai yra gan dažna praktika tarp programuotojų (ne tik PHP) - tai padeda greitai suprasti, kad kalbama būtent apie funkciją, o ne apie kintamąjį ar dar ką nors.

Pavyzdys 1:

$suma = SkaiciuSuma(5, 8, 7);
// iškviečiame funkciją ir paduodame jai tris parametrus-skaičius.

Pavyzdys 2:

$pazymiai = array(8,9,10,2,5,1,8,9,10,10,10,10);
$vidurkis = Pirmunai($pazymiai);
if ($vidurkis > 8.5) {
  echo "Mokinys yra pirmūnas";
} else {
  echo "Mokinys nėra pirmūnas";
}

Įdomus klausimas - kas atsitinka, jeigu parametrai yra aprašyti pačioje funkcijoje, bet nepaduodami per iškvietimą. Tada, be abejo, ekrane pasirodys klaida ir PHP skriptas nebus toliau vykdomas. Tačiau yra būdas to išvengti - kiekvienam parametrui priskirti reikšmę pagal nutylėjimą. Funkcijos apibrėžime galite prie kiekvieno parametro nurodyti reikšmę, kuri bus priskirta automatiškai, jeigu per iškvietima tas parametras nebus perduotas.

Pavyzdys:

function SkaiciausKvadratas ($skaicius = 2) {
  return $skaicius * $skaicius;
}
$kvadratas = SkaiciausKvadratas(5);
// funkcija grąžina 25
$kvadratas = SkaiciausKvadratas();
// funkcija grąžina 4, nes skaičiuoja kvadratą iš 2
 

Kintamųjų "matomumas"

Pažiūrėkite į šį kodo fragmentą ir pagalvokite, kas bus išvesta į naršyklę?

$skaicius = 14;
function SkaiciausKvadratas ($skaicius) {
  echo $skaicius * $skaicius;
}
SkaiciausKvadratas(2);
echo $skaicius;

Daug skaičių, ar ne? Performuluosiu klausimą kitaip: jei kintamasis su tokiu pačiu pavadinimu egzistuoja ir kaip skripto kintamasis, ir kaip funkcijos parametras, kuri reikšmė bus paimta funkcijos viduje?

Pradžioje teisingas atsakymas. Į naršyklę bus išvesta 414.

Logika tokia: funkcijos viduje esantis kintamasis arba funkcijos parametras yra ta reikšmė, su kuria funkcija dirba, ir funkcija netgi "nemato" kintamųjų už savo ribų. Tokiu būdu funkciją galima patalpinti į bet kokį kitą išorinį failą, ir pati funkcija vis tiek veiks, bet tuo pačiu reikia atsiminti ir vieną funkcijų kūrimo principą: pagal galimybes, funkcija turėtų naudoti tik jos viduje sukurtus kintamuosius, arba jie turi būti perduodami kaip parametrai.

Toks principas reikalingas dar ir tam, kad tą pačią funkciją vėliau galėtumėte panaudoti kituose projektuose, tiesiog copy-paste ir funkcija veikia, nepriklausomai nuo to, kokie kintamieji yra skirtinguose projektuose kitur.

Dar daugiau - turint omenyje, kad funkcija "nemato" išorinių kintamųjų, tokia kodo seka išves į naršyklę tuščią eilutę.

$skaicius = 14;
function SkaiciausKvadratas() {
  echo $skaicius * $skaicius;
}
SkaiciausKvadratas();

Maža to, už tokį panaudojimą, galite gauti ir PHP klaidą naršyklėje, kuri jums sakys kažką apie kintamojo neegzistavimą. Nes funkcijos viduje $skaicius kintamasis tikrai neapibrėžtas.

Tiesa, jeigu jau labai labai reikia panaudoti kažkokį kintamąjį iš išorės, tam yra variantas - operacija global:

$skaicius = 14;
function SkaiciausKvadratas() {
  global $skaicius;
  echo $skaicius * $skaicius;
}

Operatorius global sukuria funkcijoje išorinio kintamojo "kopiją", su kuria galima toliau dirbti funkcijos viduje. Bet atsiminkite, jei tas kintamasis funkcijos viduje bus pakeistas - nauja reikšmė nebus prieinama už funkcijos ribų.

 

Funkcijų parametrai-reikšmės

Yra ir dar vienas būdas dirbti su funkcijų parametrais - tai kai norisi, kad funkcija tiesiog atliktų kažkokį veiksmą su parametru ir jį grąžintų. Tai galima padaryti įprastai su return, arba galima pasinaudoti operatoriumi &. Pavyzdys:

Vietoje

function SkaiciausDaugyba($skaicius) {
  return $skaicius * 2;
}
$skaicius = 2;
$skaicius = SkaiciausDaugyba($skaicius);

... galime parašyti

function SkaiciausDaugyba(&$skaicius) {
  $skaicius = $skaicius * 2;
}
$skaicius = 2;
SkaiciausDaugyba($skaicius);

Prie funkcijos parametro esantis simbolis & nurodo, kad tas kintamasis turi būti grąžintas kaip funkcijos rezultatas. Tokia praktika gan dažnai taikoma operacijose su masyvais - kai kurios iš PHP funkcijų, skirtų darbui su masyvais, naudoja būtent tokį parametro perdavimo variantą, turbūt populiariausias pavyzdys būtų funkcija sort($array), kuri tiesiog surūšiuoja masyvą ir perduoda jį atgal kaip rezultatą.

 

Anoniminės funkcijos

Dar yra tokia funkcijų rūšis kaip anonymous functions arba dar kitaip closures, kurios pasirodė nuo PHP 5.3 versijos. Su jomis susidursite retai, bet pravartu apie jas žinoti. Taigi, nedaug kas žino, kad funkcijos parametrai gali būti ne tik kintamieji, bet ir kitos funkcijos. Tai dažniausiai pritaikoma, kai norima nurodyti, kokį kitą veiksmą atlikti po funkcijos pabaigos (arba jos metu), tai dar kartais vadinama callback. Pavyzdys - vėlgi apie masyvus, yra tokia funkcija array_map, kuri pereina per masyvo elementus ir jiems pritaiko kažkokią konkrečią funkciją - būtent ją ir paduodame kaip kintamąjį. Tai atrodo taip:

$cube = function($n) {
  return $n * $n * $n;
}
$a = array(1, 2, 3, 4, 5);
$b = array_map($cube, $a);

Šiame pavyzdyje apibrėžiame funkciją kaip kintamąjį, ir po to tą kintamąjį perduodame į kitą funkciją. Dar galima išvis atsikratyti to kintamojo ir funkciją apibrėžti būtent toje vietoje.

$a = array(1, 2, 3, 4, 5);
$b = array_map(function($n) { return $n * $n * $n; }, $a);


(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com