Învăţăm PHP: Funcţiile


Am pus cărămidă cu cărămidă elementele de bază ale PHP-ului şi practic mai avem nevoie de funcţii ca să spunem că am trecut de „grădiniţă”. Unii vor spune că ar mai fi elemente de bază (ex: clase), dar eu rămân pe linia pe care am pornit: un material pentru începători, care merge pe ce este mai uzual, urmând să crească în complexitate mai încolo. Ca o paranteză: există multe tutoriale de PHP în limba română, deci cei care nu au răbdare pot să vadă seturi finalizate precum acesta (cu o căutare pe Google găsiţi şi altele).

Să revenim. Ce sunt funcţiile? Să o luăm de la lumea reală. Închipuiţi-vă că aveţi un proces, constând în n paşi. Trebuie să îl explicaţi unui angajat. Apoi altuia. Apoi altuia… Şi tot aşa de câteva zeci de ori. În final vă plictisiţi să tot reluaţi explicarea paşilor şi îi puneţi pe o hârtie. De acum când vine cineva la Dvs pentru a afla paşii îi daţi hârtia. Felicitări: tocmai aţi creat o funcţie! În esenţă funcţiile sunt secvenţe de cod de care am avea nevoie de mai multe ori, aşa că le scriem o dată, ca funcţii, şi le apelăm de mai multe ori, de fapt de câte ori este nevoie. Să vedem un exemplu (cam forţat, pentru moment).

[PHP]$a=3;

$a=$a+5;
$a=$a*6;
$a=$a/7;
echo $a.’
‘;

$a=11;

$a=$a+5;
$a=$a*6;
$a=$a/7;
echo $a.’
‘;[/PHP]

Observaţi că liniile 3-6 sunt identice cu liniile 10-13? Nu are sens să repetăm codul. Tocmai de aceea vom defini o funcţie la care îi vom spune simplu calcul. Ei îi transmitem o valoare ca parametru, între paranteze. Codul devine astfel:

[PHP]function calcul($a){
$a=$a+5;
$a=$a*6;
$a=$a/7;
echo $a.’
‘;
}

calcul(3);
calcul(11);[/PHP]

Este mai scurt! Cu cât am avea de calculat, după „formula” descrisă, de mai multe ori, cu atât mai „rentabilă” e funcţia, scutind din repetatul de cod. Dar funcţiile nu sunt doar pentru a scrie mai puţin, ci şi pentru a separa logic părţile dintr-un cod. Gândiţi-vă că la un moment dat veţi avea sute de linii de cod, poate chiar mii. Veţi simţi necesitatea separării codului pe funcţii, iar apoi funcţiile similare pe fişiere. Până atunci să vedem mai exact ce pot face funcţiile. Pot să aibă şi mai multe argumente şi pot să returneze valori. Să vedem un exemplu:

[PHP]function calcul($a,$b){
$rezultat = $a*$b+$a+$b;
return $rezultat.’
‘;
}
echo calcul(1,2);
echo calcul(10,20);
echo calcul(100,200);[/PHP]

Util este faptul că parametrii unei funcţii pot primi valori implicite şi atunci într-un apel pot fi „săltaţi”.

[PHP]function calcul($a=1,$b=2){
$rezultat = $a*$b+$a+$b;
return $rezultat.’
‘;
}
echo calcul();
echo calcul(1);
echo calcul(2);
echo calcul(2,3);[/PHP]

La primul apel, nefiind furnizate valori pentru parametrii, funcţia va presupune că $a este 1, iar $b este 2. La al doilea apel primeşte o valoare şi o va atribui primului parametru (niciodată la al doilea, deci nu puteţi sări parametrii decât de la coadă spre început), deci face tot cu perechea 1 şi 2. Al treilea apel calculează pentru perechea 2 şi 2, iar ultimul apel pentru perechea 2 şi 3.

Sunt însă şi situaţii în care nu dorim să încărcăm funcţia cu parametrii, ci dorim să se folosească de variabilele pe care le avem deja în folosinţă, cu valori în ele. Un exemplu de greşeală de începători:

[PHP]$a=10;
function calcul(){
$a = $a*$a;
return $a.’
‘;
}
echo calcul();[/PHP]

Logica ne-ar spune că acest cod va afişa 10. Greşit. Variabila $a nu este cunoscută în cadrul funcţiei. A fost definită în afara ei. Pentru funcţie $a este necunoscută, de aceea va fi zero. $a din prima linie este o variabilă, iar $a din a treia linie este altă variabilă. Vrem să fie una şi aceeaşi variabilă? Atunci trebuie să adăugăm o singură linie, care să spună: „hei, tu, intepretorule PHP, să ştii că $a este variabila pe care deja am definit-o în exteriorul acestei funcţii”. Vedeţi codul corectat mai jos. Acesta nu va mai afişa 0, ci 100.

[PHP]$a=10;
function calcul(){
global $a;
$a = $a*$a;
return $a.’
‘;
}
echo calcul();[/PHP]

Tot cod corect este şi următorul (identic ca efect). Aparent e ciudat, pentru că variabila $a este iniţializată după funcţie. Nu e nimic ciudat: esenţial este ca variabila să aibă valoare înainte de apelul funcţiei, iar funcţia poate fi oriunde!

[PHP]function calcul(){
global $a;
$a = $a*$a;
return $a.’
‘;
}
$a=10;
echo calcul();[/PHP]

De aceea merge şi codul următor. Funcţiile pot să fie definite oriunde în cod, chiar şi după apelarea lor. Aceasta ne permite să facem „biblioteci” de funcţii. Ele trebuie undeva include, dar nu are importanţă unde. Aceasta este o excepţie: ca regulă reţineţi că, aşa cum citim un rând de la stânga la dreapta, aşa şi execuţia codului se face de la stânga la dreapta şi de sus în jos.

[PHP]$a=10;
echo calcul();
function calcul(){
global $a;
$a = $a*$a;
return $a.’
‘;
}[/PHP]

Un exemplu greşit este următorul. De ce? În clipa în care se execută funcţia, variabila $a nu este iniţializată. Se va afişa 0 şi nu 100.

[PHP]echo calcul();
$a=10;
function calcul(){
global $a;
$a = $a*$a;
return $a.’
‘;
}[/PHP]

Ar mai fi ceva important de spus, dar pentru unii ar putea fi „prematur”. Funcţiile recursive. Sunt funcţiile care se apelează pe ele însele şi care – ATENŢIE! – pot genera bucle infinite (ca un WHILE scris prost). Trebuie să fiţi siguri când scrieţi o funcţie recursivă. De exemplu mai jos am scris o funcţie sir la care îi dăm parametru, să zicem ca valoare 3. E mai mare ca zero? Da, afişează 3 şi apelează funcţia cu valoarea decrementată cu unu, adică cu 2. E mai mare ca zero? Da, afişează 2 şi apelează funcţia cu valoarea decrementată cu unu, adică cu 1. E mai mare ca zero? Da, afişează 1 şi apelează funcţia cu valoarea decrementată cu unu, adică cu 0. E mai mare ca zero? Nu. Atunci afişează rând nou (HTML) şi recursivitatea (adică auto-apelarea) se încheie. S-a afişat deci 3 2 1.

[PHP]function sir($a){
if($a>0){
echo $a.’ ‘;
sir($a-1);
}
else
echo ‘
‘;
}
echo sir(10);
echo sir(22);[/PHP]

Primul apel, cu 10, va genera evident 10 9 8 7 6 5 4 3 2 1. Pentru 22 deduceţi :) . Funcţiile recursive sunt foarte puternice, dar nu apar prea des în programarea web. Am ţinut totuşi să le menţionez.

Bravo! Aţi învăţat funcţiile! Veţi putea de acum să vă scrieţi propriile funcţii! Din fericire PHP vă reduce din efort, venind din start cu sute de funcţii. Sunt gata scrise, trebuie doar să le ştiţi utiliza. Le vine şi lor rândul, dar într-un alt material.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (1 evaluări, media: 5,00 din 5)
Loading...Loading...

1 comentariu

  1. cosmin spune:

    Am citit asa de atent lectia de azi incat am remarcat un mistype:

    „Ele trebuie undeva include, dar nu are importanţă unde.” <-incluse


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *