Utilizarea functiilor 3
- învatati sa apelati functiile
- învatati sa atribuiti unei variabile numele unei functii
- învatati sa ascundeti mesajele de eroare generate în timpul executiei unei functii
- învatati sa folositi date si scripturi aflate în fisierele externe
- învatati sa definiti propria functie
Am folosit pana acum de mai multe ori termenul de functii. In cadrul acestei lectii veti învata mai multe despre utilizarea functiilor si despre modul de definire a propriilor dumneavoastra functii.
Functiile reprezinta secvente de cod care sunt apelate foarte frecvent in cadrul codului PHP. Folosirea intensiva a functiilor contribuie la o structurare mai buna a codului; ideea este ca o problema complexa sa o divizam in mai multe sub-probleme, fiecare astfel de subproblema sa fie executata in cadrul unei functii.
Pe de alta parte folosirea frecventa a functiilor duce la micsorarea cantitatii de cod scris; prin urmare vom avea un cod care se executa mai eficient.
1. Utilizarea unei functii
Pentru a folosi o functie, scrieti numele functiei, urmat de o pereche de paranteze. De exemplu, functia rand(), care genereaza un numar întreg aleator, poate fi apelata astfel:
- rand()
Majoritatea functiilor preiau argumente, reprezentând valori, de intrare care influenteaza operarea si rezultatul functiei.
Pentru a specifica argumente, acestea se insereaza între paranteze; daca specificati mai mult de un argument, fiecare argument trebuie separat de vecinul sau printr-o virgula.
Argumentul unei functii poate fi o valoare literala, o variabila sau o expresie.
Unele functii PHP au argumente optionale, care pot fi specificate sau omise, în conformitate cu intentiile dumneavoastra. De exemplu, functia rand() are doua argumente optionale. Primul argument al functiei indica valoarea întreaga aleatoare cea mai mica pe care o va returna functia; al doilea argument indica valoarea cea mai mare. Daca omiteti ambele argumente, functia returneaza o valoare cuprinsa între 0 si cel mai mare rezultat posibil.
Puteti folosi valoarea returnata de o functie într-o expresie, astfel valoarea va fi accesibila în mod repetat fara a se invoca functia de mai multe ori
Iata un exemplu in care functia rand() returneaza o valoare aleatoare cuprinsa intre 1 si 500, atribuind valoarea unnei variabile „$nr” :
- $nr = rand(1, 500);
- echo $nr;
Când se produce o eroare în timpul executiei unei functii, PHP genereaza mesaje de eroare. Uneori, asemenea mesaje de eroare sunt nedorite. În acest caz, puteti suprima generarea mesajelor de eroare prin adaugarea in fata numelui functiei a caracterului @.
De exemplu,, pentru a suprima mesajele de eroare care pot aparea în timpul executiei functiei „f()”, scriem aceasta functie dupa cum urmeaza:
- y = @f(x);
Totusi, indicat este sa scrieti scripturi care sa nu genereze erori, ascunderea lor nu rezolva problema ce cauzeaza eroarea.
O functie utila, recomandata a fi folosita in script-uri este functia isset() si este cel mai des folosita cu „if()”.
isset() preia ca argument de obicei o variabila si arata daca aceasta a fost sau nu setata.
- De exemplu: isset($nr)
– Functia returneaza TRUE daca variabila „$nr” are setata o valoare (diferita de NULL), in caz contrar returneaza FALSE.
Aceasta functie este foarte utila in determinarea caror comenzi sa fie executate in functie daca o anumita variabila a fost setata sau nu. Previne aparitia unor erori care apar in cazuri de variabile nule si ajuta si la securitate.
De exemplu, sa presupunem ca avem un cod PHP care vrem sa fie executat numai daca prin adresa URL o fost transmisa o variabila „id”, adica o adresa de forma http://www.domeniu.site/script.php?id=un_id, folosim functia isset() astfel:
<?php
if (isset($_GET[‘id’])) {
// Se executa codul dorit
}
?>
– $_GET[‘id’] preia valoarea lui „id” din URL, iar functia isset() verifica daca aceasta valoare exista (daca in URL este „id=ceva”). Daca aceasta exista, returneaza TRUE iar functia „if”, avand astfel valoarea TRUE, va executa codul dintre acoladele ei.
Functia isset() este utila si pentru situatii de verificarii a inexistentei unei variabile, prin adaugarea caracterului (!) in fata ei. Astfel daca o anumita variabila rezulta a nu fi setata, ii atribuim o valoare sau executam un anume cod special pt. asta.
Exemplu:
if (!isset($_GET[‘id’] {
die(‘Pagina apelata este inaccesibila.’);
}
2. Utilizarea fisierelor incluse
Functiile PHP va permit sa obtineri accesul la programe PHP scrise anterior, create într-un alt fisier extern.
Pentru aceasta puteti folosi functia require(), care are urmatoarea forma:
- require(„nume_fisier”)
Când este încarcat un script PHP care contine o instructiune require, continutul fisierului specificat este inserat si executat în script, înlocuind instructiunea require.
De exemplu, sa presupunem ca realizam un site in PHP care este alcatuita din mai multe pagini, iar fiecare pagina contine in partea de sus acelasi cod HTML. In loc sa scriem de fiecare data, pentru fiecare pagina, acelasi cod HTML, il scriem o singura data intr-un fisier separat (de exemplu „antet.php”) iar in paginile unde vrem sa fie inclus codul HTML folosim functia require()
Prin insertia instructiunii la începutul scriptului din fiecare pagina PHP, ca in exemplu urmator:
<?php
require(„antet.php”);
?>
– cu aceasta determinati programul PHP sa includa continutul fisierului „antet.php” ca si cum continutul respectiv ar face parte din acel script.
Acest procedeu poate simplifica întretinerea site-ului, deoarece informatiile standard pot fi tinute într-un singur fisier, ceea ce le face usor de localizat si de modificat.
O alta functie, similara instructiunii require este functia include(). Spre deosebire de functia require() care introduce datele din fisierul extern intocmai cum sunt scrise, functia include() este o instructiune executabila ce determina evaluarea scriptului PHP din fisierul extern si codul acestuia este executat ca si cum ar fi aparut în textul scriptului unde este inclus.
Sintaxa functiei include() este urmatoarea:
- include(„nume_fisier.php”);
Functia corelata require_once() asigura faptul ca fisierul specificat este inclus o singura data într-un script dat. În cazul în care creati fisiere externe care si ele folosesc instructiunea require pentru a include continutul altor fisiere externe, puteti gasi instructiunea require_once utila.
3. Definirea unei functii
În afara de a utiliza functiile din biblioteca de functii a limbajului PHP, va puteti defini si folosi propriile functii.
Pentru a defini o functie, in PHP functiile incep intotdeauna cu declaratia: function, ca in exemplul urmator:
- function nume_functie(nume_argument) {
Aici se insereaza corpul functiei
}
Cuvântul cheie „function”, „numele_functiei” si „nume_argument” alcatuiesc antetul functiei. Termenul de corp al functiei se refera la instructiunile incluse între acolade care urmeaza dupa antetul functiei. Instructiunile din corpul functiei sunt executate atunci când functia este apelata.
Numele functiilor nu prezinta sensibilitate la diferenta între majuscule si minuscule; ca atare, „f()” si „F()” reprezinta referiri la aceeasi functie.
Daca doriti sa definiti o functie care nu are argumente, puteti omite „nume_argument”; daca doriti sa definiti o functie cu mai multe argumente, puteti include argumente suplimentare dupa „nume_argument”, fiecare argument fiind separat de vecinul sau printr-o virgula. Parantezele si numele argumentelor incluse între acestea poarta numele de lista cu argumente.
Ca exemplu, iata o functie care calculeaza aria unui dreptunghi:
<?php
function arie($lungime, $latime) {
return $lungime * $latime;
}
?>
Lista cu argumente a functiei „arie()” include argumentele $latime si $inaltime. Corpul functiei este alcatuit dintr-o singura instructiune; cu toate acestea, corpul unei functii poate contine mai multe instructiuni.
Daca doriti ca o functie sa returneze o valoare, trebuie sa determinati functia sa execute o instructiune return care furnizeaza valoarea respectiva.
Instructiunea return determina sistarea executarii functiei; nu este necesar ca aceasta sa fie ultima instructiune fizica din corpul functiei. Daca definiti o functie care nu are nici o instructiune return (sau pentru date de iesire, precum „echo”), functia va returna valoarea speciala NULL.
4. Apelarea unei functii definite de utilizator
O functie definita de utilizator poate fi apelata ca orice functie.
De exemplu, iata o instructiune care apeleaza functia „arie()” din exemplul anterior:
<?php
function arie($lungime, $latime) {
return $lungime * $latime;
}
$rezultat = arie(5,3);
echo „Aria exte : $rezultat”;
?>
Valorile argumentelor 5 si 3 le înlocuiesc pe acelea ale argumentelor din corpul functiei, care se comporta ca si cum ar fi fost scrisa astfel:
- return 5*3
Rezultatul afisat al acestui script va fi :
Aria exte : 15
5. Terminarea executiei unui script
O instructiune return determina sistarea executiei functiei care o contine. In cazul în care doriti sa sistati prelucrarea unui întreg script, puteti invoca functia exit().
Iata un exemplu simplu:
<?php
function stop() {
exit();
}
echo „<br />Unu…”;
echo „<br />Doi…”;
stop();
echo „<br />Trei…”;
?>
Dupa executie, scriptul afiseaza:
Unu…
Doi…
Rezultatul acestui script include cuvintele „Unu” si „Doi”, dar nu si cuvântul „Trei”. Prin apelarea functiei „stop()” se executa corpul functiei respective; la invocarea functiei, exit(), executia scriptului se încheie.
6. Functii recursive
Este posibil ca o functie din PHP sa se auto-apeleze. O functie care procedeaza astfel se numeste „functie recursiva”. Totusi, daca nu aveti experienta de programare, este recomandat sa nu scrieti functii recursive. Cu toate acestea, puteti scrie accidental sau intalni o asemenea functie, deci este util sa stiti unele notiuni referitoare la aceasta.
Studiati scriptul urmator care defineste si invoca o functie recursiva simpla:
<?php
function recursor($nr) {
$nr++;
if ($nr<8) {
return recursor($nr);
}
return $nr;
}
$x = recursor(3);
echo $x;
?>
– Daca rulati acest script, rezultatul afisat va fi 8.
– Variabila „$x” primeste ca valoare functia „recursor()” careia ii transmite ca argument numarul 3.
– Functia „recursor()” incrementeaza cu o unitate valoarea argumentului, prin „$nr++;” care devine 4, apoi conditia „if ($nr<8)” verifica daca aceasta variabila din functie e mai mica decat 8, in caz afirmativ se executa comanda „return recursor($nr);” care sisteaza executia altui cod din functie si auto-apeleaza iar functia (cu noua valoare a lui „$nr” ca argument) care iar incrementeaza valoarea lui „$nr” si verifica din nou conditia care iar autoapeleaza functia, … si tot asa pana cand „$nr” va avea valoarea 8 si la verificare conditiei „if” aceasta returneaza FALSE si se trece mai departe la executia comenzii „return $nr;” care va returna 8 ca valoare a variabilei „$x”.
Functia „echo” va afisa valoarea lui „$x”, adica 8.
7. Definirea argumentelor prestabilite
PHP va permite sa definiti functii cu argumente prestabilite. Daca apelati o functie care are un argument prestabilit, dar nu furnizati nici o valoare pentru argumentul respectiv, argumentul ia o valoare prestabilita specificata la inceput.
Iata un exemplu simplu, studiati-l cu atentie:
<?php
function impozit_vanzari($cantitate, $rata = 0.0725) {
return $cantitate * $rata;
}
$cumparaturi = 123.45;
echo „<br />cumparaturi = $cumparaturi”;
$impozit1 = impozit_vanzari($cumparaturi, 0.09);
echo „<br />impozit1 = $impozit1”;
$cumparaturi = 123.45;
echo „<br /><br />cumparaturi = $cumparaturi”;
$impozit2 = impozit_vanzari($cumparaturi);
echo „<br />impozit2 = $impozit2”;
?>
Rezultatu afisat va fi:
cumparaturi = 123.45
impozit1 = 11.1105
cumparaturi = 123.45
impozit2 = 8.950125
– Functia impozit_vanzari preia doua argumente: un argument obligatoriu, denumit $cantitate, si un argument prestabilit, denumit $rata.
Daca apelati functia si furnizati un singur argument, valoarea argumentului respectiv se considera ca fiind valoarea argumentului $cantitate, iar valoarea 0.0725 se foloseste ca valoare a argumentului $rata. Astfel, la prima invocare a functiei, pentru „impozit1”, $rata are valoarea 0.09, specificata drept al doilea argument al functiei. Cu toate acestea, la a doua invocare a functiei, pentru „impozit2”, $rata are valoarea 0.0725 deoarece este specificata valoarea unui singur argument, si astfel „$rata” a preluat valoarea prestabilita initial.
– O lista cu mai multe functii php matematice este la pagina -> Functii Matematice
– De asemenea, o lista cu functii utile in lucrul mai avansat cu functii gasiti la pagina -> Functii pentru lucru cu functii
Variabile si referinte in functii
- învatati sa folositi variabile globale, locale si statice
- învatati sa folositi referintele
Variabilele functiilor in PHP sunt de doua tipuri principale:
- Variabile globale
- Variabile locale
Variabilele globale sunt create în exteriorul functiei, în timp ce variabilele locale sunt create în interiorul unei functii.
1. Utilizarea variabilelor globale
Asa cum s-a explicat anterior, variabilele globale sunt cele declarate în afara oricarei functii.
Totalitatea locurilor unde este accesibila o variabila se numeste „domeniu de existenta al variabilei”. Variabilele globale nu pot fi accesibile din interiorul corpului unei functii; cu alte cuvinte, domeniul de existenta al unei variabile globale, nu include corpurile functiilor. Daca doriti sa obtineti accesul la o variabila globala în cadrul unei functii, puteti extinde domeniul de existenta al variabilei prin specificarea in functie a numelui variabilei, în cadrul unei instructiuni GLOBAL.
Instructiunea GLOBAL are urmatoarea forma:
- GLOBAL variabila1, variabila2, variabila3;
Iata un exemplu concludent :
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
return $var1 + $var2;
}
echo „Suma este „. Suma();
?>
– Functia „Suma()” foloseste variabilele $var1 si $var2 declarate anterior, dar aceste variabile nu au domeniu de valabilitate in interiorul functiei. Prin urmare rezultatul functiei este NULL.
Pentru a rezolva aceasta problema vom declara cele doua variabile ca fiind variabile globale, ca in exempul urmator:
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
GLOBAL $var1, $var2;
return $var1 + $var2;
}
echo „Suma este „. Suma();
?>
– In exemplul de mai sus declaratia: „GLOBAL $var1, $var2” face ca variabilele $var1 si $var2 sa fie recunoscute si in interiorul functiei.
– Puteti scrie si cu litere mici „global”, dar e mai usor de recunoscut cu litere mari.
O alta metoda prin care putem solutiona aceasta problema este prin folosirea variabilei PHP predefinite $GLOBALS, dupa cum puteti vedea in exemplu urmator:
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
return $GLOBALS[‘var1’] + $GLOBALS[‘var2’];
}
echo „Suma este „. Suma();
?>
$GLOBALS este o variabila predefinita, este de fapt un array ; elementele acestei matrice au cheia egala cu numele variabilelor declarate si valoarea egala cu cea a variabilelor declarate.
$GLOBALS este o variabila superglobala, ea va fi recunoscuta in orice script.
Puteti folosi oricare din cele doua variante prezentate: instrucrtiunea GLOBAL sau variabila $GLOBALS.
In cele doua exemple prezentate mai sus rezultatul afisat va fi acelasi :
Suma este 385
2. Utilizarea variabilelor locale
Variabilele locale sunt create in interiorul functiei si sunt distruse cand se încheie apelul la functia respectiva. În consecinta, variabilele locale sunt disponibile numai pe durata executiei functiei asociate.
Argumentele functiilor constituie un tip important de variabila locala. Cu toate acestea, puteti crea o variabila locala prin simpla atribuire a unei valori unei variabile din interiorul unei functii.
Pentru a ilustra deosebirea dintre variabilele locale si cele globale, iata un script care defineste o variabila locala denumita „$x” si o variabila globala cu acelasi nume:
<?php
function v_local() {
$x = 5;
echo „<br />In corpul functiei x = $x”;
}
$x = 2;
echo „<br />In corpul scriptului x = $x”;
v_local();
echo „<br />In corpul scriptului x = $x”;
?>
Cand executati acest script, veti primi urmatoarele rezultate:
In corpul scriptului x = 2
In corpul functiei x = 5
In corpul scriptului x = 2
Remarcati diferenta dintre cele doua variabile $x, chiar daca numele variabilelor este acelasi.
Cand este apelata functia v_local(), $x ia valoarea 5, in rest, inainte si dupa, ia valoarea 2.
Domeniul de existenta al variabilei globale $x nu se extinde în interiorul corpului functiei v_local(), iar domeniul de existenta al variabilei locale $x nu se extinde dincolo de corpul functiei respective. Cu alte cuvinte, domeniile de existenta ale celor doua variabile sunt complet distincte.
3. Utilizarea variabilelor statice
Uneori este nevoie ca o variabila locala sa-si pastreze valoarea de la un apel al functie asociate la altul. Altfel spus, nu doriti ca variabila sa fie distrusa la încheierea apelului la functie.
Pentru acest lucru puteti folosi instructiunea STATIC (la fel cu „static”).
Forma instructiunii STATIC este similara cu aceea a instructiunii GLOBAL.
- STATIC $var1, $var2, $var3;
O variabila afisata într-o instructiune STATIC este cunoscuta sub numele de „variabila statica”.
Iata un exemplu care prezinta modul de utilizare a unei variabile statice:
<?php
function v_local() {
$x = $x + 1;
echo „<br /> x = $x”;
}
function v_static() {
STATIC $x;
$x = $x + 1;
echo „<br /> x = $x”;
}
v_local();
v_local();
v_local();
v_static();
v_static();
v_static();
?>
Daca rulati acest script, veti primi urmatoarele rezultate:
x = 1
x = 1
x = 1
x = 1
x = 2
x = 3
Observati ca variabila locala $x, definita în cadrul functiei v_local(), este creata din nou la fiecare apelare a functiei, în consecinta, valoarea sa este întotdeauna afisata ca fiind egala cu 1.
Prin contrast, variabila statica $x, definita în cadrul functiei v_static(), îsi pastreaza valoarea de la un apel al functiei la urmatorul; ca atare, valoarea sa creste de fiecare data când este executata functia.
4. Utilizarea referintelor
In mod prestabilit, argumentele transferate unei functii PHP sunt transmise prin valoare, ceea ce înseamna ca valorile argumentelor sunt copiate si functiile utilizeaza copii ale valorilor argumentelor lor, nu argumentele în sine. Ca o consecinta, o functie PHP nu poate modifica valorile argumentelor sale.
Totusi, puteti stabili ca o functie sa aiba posibilitatea de a modifica valoarea unui argument, specificând ca argumentul sa fie transferat prin referinta.
Când un argument este transferat prin referinta, valoarea sa nu este copiata; functia lucreaza cu valoarea argumentului si are libertatea de a modifica acea valoare.
Pentru a specifica faptul ca un argument urmeaza a fi transferat prin referinta, inaintea argumentului va fi adaugat un caracter ampersand (&). Puteti atasa acest caracter la argument în antetul functiei sau în apelul la functie.
Iata un exemplu care prezinta apelul prin valoare si apelul prin referinta:
<?php
function p_valoare($a) {
$a = 1;
}
function p_referinta(&$a) {
$a = 1;
}
$b = 0;
p_valoare($b);
echo „<br /> \$b = $b”;
$b = 0;
p_valoare(&$b);
echo „<br /> \$b = $b”;
$b = 0;
p_referinta($b);
echo „<br /> \$b = $b”;
?>
Dupa rulati acest script, veti obtine urmatoarele date de iesire:
$b = 0
$b = 1
$b = 1
Retineti ca scriptul contine doua functii, si anume „p_valoare()” si „p_referinta()”. Fiecare functie preia un singur argument, denumit $a. Antetul functiei „p_referinta()” specifica faptul ca argumentul sau este transferat prin referinta; argumentul functiei „p_valoare()” este transferat prin valoare.
Primul paragraf al programului invoca functia „p_valoare()”, transferând argumentul prin valoare. În consecinta, functia lucreaza cu o copie a argumentului sau, iar valoarea variabilei $b nu se modifica.
Cel de-al doilea paragraf al programului invoca de asemenea functia „p_valoare()”; dar, foloseste un caracter ampersand (&) pentru a determina transferul prin referinta al valorii variabilei $b. În consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 în 1.
Cel de-a treilea paragraf al programului invoca functia „p_referinta()”. Antetul functiei respective foloseste un caracter ampersand (&) pentru a specifica faptul ca valoarea argumentului sau este transferata prin referinta, în consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 în l.
Prin utilizarea referintelor se evita suprasarcina de copiere a valorilor argumentelor si implicit se obtine o viteza mai mare de executie a programului. Cu toate acestea, programele devin astfel mai dificil de înteles, iar referintele sau apelurile prin referinta pot cauza erori de program. Cel mai indicat este sa evitati referintele, acolo unde este posibil, si sa definiti functii care returneaza valori, si nu functii care modifica valorile propriilor argumente.
In versiunile PHP 5+, transmiterea la functiei a unui parametru prin referinta „Call-time pass-by-reference”, p_valoare(&$b), a fost scoasa din uz. Dar poate fi activata din php.ini, daca aveti acces, prin setarea ‘true’ la „allow_call_time_pass_reference”.