Functii in PHP
0
Functiile sunt blocuri de cod PHP (secvente de cod) bine delimitate si identificate printr-un nume, ce executa un set de operatii. Functiile pot fi executate de mai multe ori in cadrul unui script prin simpla apelare a numelui lor.
Exista functii predefinite, specifice limbajului PHP (cum ar fi print, empty, etc) ce poti fi folosite in orice moment, fara a fi nevoie de vreo actiune speciala; si exista functii definite de utilizator, scrise practic de programatori. Pentru ca acestea sa poata fi folosite este nevoie sa fie declarate (si implementate).
Exemplu de functie definita de utilizator:
<?php # functiile se declara folosind cuvantul cheie "function" urmat de numele functiei # numele functiei trebuie sa fie orice identificator valid (adica sa inceapa cu # litere sau cu caracterul _ ) si sa nu contina caractere speciale sau spatiu # dupa numele functiei se pun paranteze rotunde # corpul functiei (implementarea) trebuie incadrata in acolade function afisLuna() { $luni = array( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); echo '<select>'; for( $i = 0; $i < 12; $i++ ) { # intrucat se cunosc nr de pasi, se foloseste structura repetitiva for echo "<option>{$luni[ $i ]}</option>\n"; } echo '</select>'; } # mai jos vom folosi functia pentru a afisa un drop-down cu lunile anului: echo 'Luna inceperii activitatii: '; afisLuna(); echo '<br /><br />Luna terminarii activitatii: '; afisLuna(); ?>
Rezultatul codului PHP este reprezentat mai jos:
Luna inceperii activitatii:
Luna terminarii activitatii:
Am scris, asadar, o singura data codul care afiseaza lunile anului si l-am apelat de cate ori am avut nevoie. Apelarea functiei se face prin specificarea numelui urmat de paranteze. Intre paranteze se pot specifica parametrii, dupa cum vom vedea mai jos. Alternativ, o functie definita de utilizator se poate apela folosind instructiunea call_user_func
# vom rescrie ultima parte a codului echo 'Luna inceperii activitatii: '; call_user_func( 'afisLuna' ); echo '<br /><br />Luna terminarii activitatii: '; call_user_func( 'afisLuna' );
Instructiunea call_user_func este utila atunci cand numele functiei este furnizat de o variabila, cu ajutorul caruia se poate apela dinamic o functie. Exemplu:
<?php # definesc 2 functii diferite function unu() { print 'Azi suntem in intai!<br />'; } function alta() { print 'Azi e o zi obisnuita<br />'; } # declar o variabila care sa aiba ca valoare numele functiei $functie = 'unu'; # variabila $functie poate sa se schimbe in functie de diferite conditii # in cazul nostru, daca ziua curenta e prima zi din luna, valoarea va fi 'unu' if( date( 'd' ) == 1 ) $functie = 'unu'; else $functie = 'alta'; # la final apelez dinamic functia data de variabila # Interpretorul nu stie exact care functie va fi - el doar executa ce-i transmite variabila # eventual pot face niste validari: # - function_exists verifica daca functia transmisa a fost definita # - is_callable verifica daca variabila transmisa poate fi apelata ca functie if( function_exists( $functie ) && is_callable( $functie ) ) { call_user_func( $functie ); } else { echo "Nu pot apela functia $functie"; } // Rezultat (live): Azi e o zi obisnuita ?>
Foarte important de stiut este faptul ca variabilele definite in afara functiilor nu sunt disponibile in interiorul lor. Astfel, codul de mai jos nu va functiona asa cum ne asteptam:
<?php # declar o variabila $a = "Afara e frumos"; # definesc o functie function afisMesaj() { echo $a; } # apelez functia afisMesaj(); // nu va afisa nimic!! ?>
Functia nu va afisa mesajul, asa cum v-ati fi gandit la prima vedere. Asta pentru ca ce este definit in afara functiei nu este recunoscut in interior. In mod similar, variabilele definite in interiorul unei functii se pierd si NU sunt disponibile in afara acesteia.
Exista totusi o modalitate prin care variabilele definite in afara unei functii sa fie 'aduse' in interiorul ei: folosind intructiunea global.
<?php # declar o variabila $a = "Afara e frumos"; # definesc o functie function afisMesaj() { # folosind cuvantul 'global' ii spun interpretorului PHP ca # vreau sa folosesc o variabila din afara functiei global $a; echo $a; } # apelez functia afisMesaj(); // va afisa Afara e frumos ?>
Daca e nevoie sa se foloseasca mai multe variabile globale in cadrul unei functii, acestea se pot specifica toate intr-o singura instructiune global:
global $a, $b, $Vector;
De ce sunt folosite functiile?
1
Printre avantajele folosirii functiilor, se numara:
-
reutilizarea codului
Spre exemplu, daca este nevoie sa se execute aceeasi secventa de cod in mai multe parti ale unui programm sau script, pentru a nu se rescrie codul de fiecare data, se defineste o functie care este apelata de mai multe ori, asa cum am facut in primul exemplu de mai sus
-
modularizare
Odata cu aparitia functiilor (a subprogramelor, in general) s-a introdus si conceptul de modularizare care presupune impartirea (spargerea) problemei ce trebuie rezolvata in probleme mai mici. Fiecare modul problema mai mica reprezinta un subprogram, implementat intr-o functie care contribuie la rezultatul final.
Spre exemplu, avem o operatie (relativ) complexa: afisarea inbox-ului unui utilizator. Aceasta problema poate fi impartita in parti mai mici/simple. Pentru fiecare parte s-ar defini cate o functie in loc sa se scrie un singur script foarte mare, iar la final codul va arata cam in felul urmator:preluareDateAutentificare(); verificareDate(); preluareMesajeInbox(); afisareInbox();
-
mentinerea usoara a codului si intelegerea mai usoara a logicii aplicatiei sau a scriptului
Acestea sunt urmari imediate ale primelor 2 puncte. Daca scriptul este structurat, impartit in bucati mai mici, in care aceleasi secvente de cod nu se repeta atunci va fi mai usor si de inteles si de modificat sau intretinut.
Salut. Am dat peste acest tutorial superb si nu am incetat sa il citesc deloc. Am ajuns deocamdata la acest capitol.
In ultimul timp m-a procupat optimizarea codului php daca intelegeti. As dori daca s-ar putea sa initiati un capitol care sa cuprinda mai multe indicii care sa duca spre functionarea mai rapida, optima si care sa consume mai putine resurse ale serverului.
Felicitaru pentru munca depusa:)
Adauga un comentariu la aceasta sectiune.
Valori returnate. Parmetrii
3
De multe ori este nevoie ca o functie sa returneze o valoare. Majoritatea functiilor predefinite fac lucrul asta; spre exemplu empty returneaza TRUE sau FALSE in functie de starea si continutul unei variabile transmise ca parametru.
Si functiile definite de utilizator pot returna o valoare, cu ajutorul instructiunii return. Exemplu:
<?php function formatareData() { $rezultat = date( 'd-m-Y' ); return $rezultat; } # rezultatul returnat de functie poate fi folosit in diferite moduri: $azi = formatareData(); // atribuirea rezultatului print formatareData(); // afisarea rezultatului formatareData(); // rezultatul nu este folosit - daca functia nu printeaza ceva // atunci apelul nu are nici un efect vizibil ?>
De asemenea, functiile pot primi date ce pot fi folosite in interiorul lor pentru diverse prelucrari. Aceste date de intrare sunt transmise sub forma de parametrii.
Pentru ca o functie sa poata primi parametrii, aceasta trebuie sa ii declare intre parantezele rounde, ca in exemplul de mai jos
<?php # functia este declarata sa primeasca 2 parametrii ce vor fi prelucrati # functia returneaza si o valoare, in functie de datele de intrare function minim($a, $b) { if( $a < $b ) return $a; else return $b; } # la apelul functiei, este obligatoriu sa se transmita 2 parametrii # parametrii pot fi orice expresie (variabile, constante, rezultatul altor functii, etc) print minim( 3, 4 ); // parametrii sunt 2 valori numerice $x = 1; $y = 4; print minim( $x, $y ); // parametrii sunt 2 variabile $x = 4; $a = 3; $b = 5; print minim( $x, minim( $a, $b ) ); // parametrii primului apel sunt: variabila $x // si rezultatul unui alt apel cu 2 parametrii diferiti ?>
Nota: intrucat functia minim() returneaza o valoare, ea poate fi folosita ca si cum ar fi un numar normal. De aceea apelul de mai sus este valid. Alte exemple valide sunt mai jos:
<?php $a = 1 + minim( 4, 3 ); if( minim( $a, 4 ) > 5 ) { echo "If-ul este True"; } else { echo "If-ul este False"; } ?>
O facilitate avansata oferita de limbajul PHP este folosirea valorilor predefinite pentru parametrii functiilor. Aceasta permite ca o functie sa nu fie apelata cu toti parametrii ei, urmand ca pentru valorile care lipsesc sa fie folosite valorile predefinite. Functia minim() definita mai sus poate fi rescrisa in felul urmator:
<?php function minim($a = 1, $b = 2) { if( $a < $b ) return $a; else return $b; } ?>
Declararea functiei de mai sus se traduce in felul urmator: daca functia minim() nu este apelata cu toti parametrii, atunci foloseste valoarea 1 pt $a si valoarea 2 pt $b in calculele din interiorul functiei. In acest caz, functia se poate apela in felul urmator:
<?php echo minim(); // echivalent cu echo minim(1,2); echo minim(7); // echivalent cu echo minim(7,2); echo minim(7,8); // apel normal cu toti parametrii ?>
felicitari pentru exemplele despre functii!
Foarte inteligibil...
unde gasesc functiile in aardvark topsites ?
Adauga un comentariu la aceasta sectiune.
Facilitati avansate referitoare la functii
3
Pe langa functionalitatile standard, explicate mai sus, limbajul PHP dispune de alte caracteristici mai avansate. Astfel, pot fi definite functii ce pot primi oricati parametrii este nevoie, pot fi executate functii de fiecare data la terminarea executiei unui script PHP, etc. Acestea nu sunt insa lucruri folosite de zi cu zi, asa ca prezentarea lor depaseste scopul acestui site. Nu trebuie sa le invatati acum, ci doar sa stiti ca exista.
Mai jos amintite sunt cateva din functiile avansate ce pot fi folosite:
- call_user_func - alternativa pentru apelul simplu al unei functii definite de utilizator; numele functiei poate fi stocat intr-o variabila, programatorul putand astfel apela functii diferite in situatii diferite
- call_user_func_array - la fel ca ma sus, doar ca este folosita atunci cand functia ce trebuie apelata are mai mult de un parametru
- function_exists - folosita pentru a verifica daca o functie este definita
- create_function - folosita pentru a defini o functie 'on the fly', atunci cand codul PHP se executa
- register_shutdown_function - folosita pentru a specifica o functie care sa se execute la finalul executiei codului PHP
- func_num_args, func_get_args, func_get_arg - functii ajutatoare folosite in cazul functiilor apelate cu un numar variabil de parametrii
Facilitatile avansate legate de functii probabil ca nici nu va vor folosi pana nu veti incepe sa lucrati la aplicatii mai complexe (de multe ori nici in acest caz). E suficient doar sa stiti ca exista.
Cum fac o functie sa fie apelata la un interval de timp. Am vazut ca ati precizat in exemple. Mi-ar fi de folos.
Sincer, am retractat informatia. Se poate apela o functie cu o intarziere, sau mai exact spus se poate amana (intarzia) executia unui script cu un numar de secunde, dar nu se poate apela o functie la intervale regulate de timp, in mod continuu. Arhitectura si mediul de executie nu o permite (ar insemna ca un request catre o pagina web sa poata dura la nesfarsit). Imi pare rau pentru confuzie :)
Adauga un comentariu la aceasta sectiune.
Nimic de afisat.
Adauga un comentariu la aceasta sectiune.