105
<titlu>Modulul 7: Utilizarea funcþiilor</titlu>
<titlu>Scopuri</titlu>
• învãþaþi sã apelaþi funcþiile
• învãþaþi sã atribuiþi unei variabile numele unei funcþii
• învãþaþi sã ascundeþi mesajele de eroare generate în timpul execuþiei unei funcþii
• învãþaþi sã folosiþi programele rezidente în fiºierele externe
• învãþaþi sã definiþi o funcþie
• învãþaþi sã folosiþi variabile globale, locale si statice
• învãþaþi sã folosiþi referinþele
În Modulul 2 a fost prezentatã noþiunea de funcþie, care simplificã efectuarea unei varietãþi de calcule. În cadrul acestui modul, veþi învãþa mai multe despre utilizarea funcþiilor ºi despre modul de definire a propriilor dumneavoastrã funcþii.
<titlu>Utilizarea unei funcþii</titlu>
Procesul de executare a unei funcþii se numeºte utilizarea, apelarea sau invocarea funcþiei. Pentru a folosi o funcþie, scrieþi numele funcþiei, urmat de o pereche de paranteze. De exemplu, funcþia rand(), care genereazã un numãr întreg aleator, poate fi apelatã astfel:
rand();
Majoritatea funcþiilor preiau argumente, reprezentând valori, de intrare care influenþeazã operarea ºi rezultatul funcþiei. Pentru a specifica argumente, acestea se insereazã între paranteze; dacã specificaþi mai mult de un argument, fiecare argument trebuie separat de vecinul sãu prin intermediul unei virgule. Argumentul unei funcþii poate fi o valoare literalã, o variabilã sau o expresie.
Unele funcþii PHP au argumente opþionale, care pot fi specificate sau omise, în conformitate cu intenþiile dumneavoastrã. De exemplu, funcþia rând () are douã argumente opþionale. Primul argument al funcþiei indicã valoarea întreagã aleatoare cea mai micã pe care o va returna funcþia; al doilea argument indicã valoarea cea mai mare. Dacã omiteþi ambele argumente, funcþia returneazã o valoare cuprinsã între 0 ºi cel mai mare rezultat posibil. Dacã doriþi, puteþi specifica primul argument, omiþându-1 pe al doilea:
rand(100);
106
Astfel, funcþia este obligata sã returneze o valoare cuprinsã între 100 ºi cel mai mare rezultat posibil.
Ca ºi rand(), majoritatea funcþiilor returneazã valori. Puteþi folosi într-o expresie valoarea returnatã de o funcþie. O situaþie foarte frecventã în care se procedeazã astfel o constituie utilizarea valorii returnate de o funcþie într-o expresie de atribuire, astfel încât valoarea sã fie accesibilã în mod repetat fãrã a se invoca funcþia de mai multe ori. De exemplu:
$gogoasa = rand(1, 12);
Când se produce o eroare în timpul execuþiei unei funcþii, PHP genereazã mesaje de eroare. Uneori, asemenea mesaje de eroare sunt nedorite. În acest caz, puteþi suprima generarea mesajelor de eroare prin prefixarea numelui funcþiei invocate cu ajutorul caracterului @. De exemplu,, pentru a suprima mesajele de eroare care pot apãrea în timpul execuþiei funcþiei f ( ), invocaþi aceastã funcþie dupã cum urmeazã:
Y = @f(x);
<Test „la minut">
• Scrieri o instrucþiune care atribuie variabilei $x un numãr întreg aleator cuprins între l ºi 10.
• Scrieri o instrucþiune care invocã funcþia sensibil_la_erori(), care nu preia nici un argument ºi nu returneazã nici un rezultat, suprimând toate mesajele de eroare rezultate.
</Test „la minut">
<titlu>Utilizarea fiºierelor incluse</titlu>
Funcþiile PHP vã permit sã obþineri accesul la programe PHP scrise anterior, create de dumneavoastrã sau de cãtre un alt programator în limbajul PHP. Un alt mecanism care vã permite sã obþineri accesul la programele scrise anterior îl constituie instrucþiunea require, care are urmãtoarea formã:
require(nume_fisier);
Argumentul nume_fisier are forma unui ºir, deci o instrucþiune require caracteristicã poate avea urmãtorul aspect:
require(„fisierul.inc”);
Când este încãrcat un script PHP care conþine o instrucþiune require, conþinutul fiºierului specificat - cunoscut sub numele de fiºier de includere - este inserat în script,
<notã>
Rãspunsuri la test:
• $x = rand(1, 10);
• @sensibil_la_erori( ) ;
107
înlocuind instrucþiunea require. Dacã fiºierul de includere conþine linii de program PHP, trebuie sã includã etichetele <?php ºi ?>, amplasate în locaþiile adecvate.
Deºi se obiºnuieºte ca un fiºier de includere sã primeascã extensia de fiºier inc, nu este obligatoriu sã procedaþi astfel. Unii programatori PHP preferã sã foloseascã extensia de fiºier php pentru toate fiºierele pe care le creeazã.
Instrucþiunea require vã poate scuti de un mare volum de muncã. De exemplu, sã presupunem cã scrieþi o aplicaþie PHP care este alcãtuitã din mai multe scripturi, iar fiecare script afiºeazã o paginã HTML care conþine informaþii standard în partea de sus a paginii. Puteþi crea un fiºier script special, denumit antet.inc, care conþine urmãtoarele linii de program:
<HTML>
<HEAD>
<TITLE>Aplicatia care pune capac la toate aplicatiile</TITLE>
</HEAD>
<BODY>
<H1>Aceasta este aplicatia care incheie toate aplicatiile</H1>
<H5>Copyring 2005, Fane Programatorul si Compania SRL.</H5>
si asa mai departe…
Prin inserþia instrucþiunii
require(„antet.inc”);
la începutul fiecãrui script, determinaþi programul PHP sã includã conþinutul acelui fiºier ca ºi cum conþinutul respectiv ar face parte din acel script. Acest procedeu poate simplifica întreþinerea programului, deoarece informaþiile standard pot fi rezidente într-un singur fiºier, ceea ce le face uºor de localizat ºi revizuit.
<Sfatul expertului>
Întrebare: Dacã doresc sã obþin numele unui fiºier de includere din program, cum pot proceda?
Rãspuns: Instrucþiunea require este prelucratã la încãrcarea scriptului PHP asociat, înaintea legãri valorilor la variabilele corespunzãtoare, în consecinþã, nu puteþi folosi o expresie pentru, a specifica numele fiºierului care urmeazã a fi inclus de cãtre o instrucþiune require.
ªi totuºi puteþi folosi instrucþiunea include, care este o instrucþiune executabilã ce determinã evaluarea scriptului PHP dintr-un fiºier specificat. De exemplu, instrucþiunea include din urmãtorul program evalueazã fiºierul f isier1:
$x = 1;
include("fiºier" . $x . ". inc");
La evaluarea fiºierului de includere, instrucþiunile PHP pe care le conþine sunt executate ca ºi cum ar fi apãrut în textul scriptului apelant</Sfatul expertului>
108
Instrucþiunea corelatã require_once asigurã faptul cã fiºierul specificat este inclus o singurã datã într-un script dat. În cazul în care creaþi fiºiere de includere care folosesc instrucþiunea require pentru a include conþinutul altor fiºiere de includere, puteþi gãsi instrucþiunea require_once utilã.
<Test „la minut">
• Scrieþi o instrucþiune care include conþinutul fiºierului subsol.inc în textul sursã curent.
• Scrieþi o instrucþiune care include conþinutul fiºierului subsol. inc în textul sursã curent, asigurându-vã cã fiºierul este inclus o singurã datã. </Test „la minut">
<titlu>Definirea unei funcþii</titlu>
În afarã de a utiliza funcþiile din biblioteca de funcþii a limbajului PHP, vã puteþi defini ºi folosi propriile funcþii. Pentru a defini o funcþie, respectaþi modelul urmãtor:
function nume_functie(nume_argument)

// aici se insereaza corpul functiei

In cadrul modelului, nume_functie este numele funcþiei, iar nume_argument este numele argumentului funcþiei, în PHP, numele funcþiilor nu prezintã sensibilitate la diferenþa între majuscule ºi minuscule; ca atare, f () ºi F() reprezintã referiri la aceeaºi funcþie. Cuvântul cheie function, numele funcþiei ºi lista cu argumente alcãtuiesc antetul funcþiei. Termenul de corp al funcþiei se referã la instrucþiunile incluse între parantezele acolade care urmeazã dupã antetul funcþiei. Instrucþiunile din corpul funcþiei sunt executate atunci când funcþia este apelatã.
Dacã doriþi sã definiþi o funcþie care nu are argumente, puteþi omite nume_argument; dacã doriþi sã definiþi o funcþie cu mai multe argumente, puteþi include argumente suplimentare dupã nume_argument, fiecare argument fiind separat de vecinul sãu prin intermediul unei virgule. Parantezele ºi numele argumentelor incluse între acestea poartã numele de listã cu argumente. Ca exemplu, iatã o funcþie care calculeazã aria unui dreptunghi:
function calculeaza_arie($inaltime,$latime)

return$inaltime * $latime;

<notã>
Rãspunsuri la test:
• require("subsol.inc");
• require_once("subsol.inc");</notã>
109
Lista cu argumente a funcþiei calculeaza_arie include argumentele $latime ºi $inaltime. Corpul funcþiei este alcãtuit dintr-o singurã instrucþiune; cu toate acestea, corpul unei funcþii poate conþine un numãr arbitrar de instrucþiuni. Dacã doriþi ca o funcþie sã returneze o valoare, trebuie sã determinaþi funcþia sã execute o instrucþiune return care furnizeazã valoarea respectivã. Instrucþiunea return determinã sistarea executãrii funcþiei; nu este necesar ca aceasta sã fie ultima instrucþiune fizicã din corpul funcþiei. Dacã definiþi o funcþie care nu are nici o instrucþiune return, funcþia va returna valoarea specialã NULL.
<titlu>Apelarea unei funcþii definite de utilizator</titlu>
O funcþie definitã de utilizator poate fi apelatã în acelaºi mod ca o funcþie încorporatã. De exemplu, iatã o instrucþiune care apeleazã funcþia calculeaza_arie:
$arie = calculeaza_arie(2,4);
Valorile argumentelor efective — 2 ºi 4 - le înlocuiesc pe acelea ale argumentelor formale din corpul funcþiei calculeaza_arie, care se comportã ca ºi cum ar fi fost scrisã astfel:
return 2 * 4;
<Sugestie>
În PHP 3, definiþia unei funcþii trebuie sã preceadã linia de program care apeleazã funcþia, în PHP 4, definiþia unei funcþii poate fi plasatã fie anterior liniei de program care apeleazã funcþia, fie dupã aceasta. </Sugestie>
<titlu>Terminarea execuþiei unei funcþii</titlu>
O instrucþiune return determinã sistarea execuþiei funcþiei care o conþine. In cazul în care doriþi sã sistaþi prelucrarea unui întreg script, puteþi invoca funcþia exit(). Iatã un exemplu simplu:
function stop()

exit();

echo „<BR>Unu…”;
echo „<BR>Doi…”,
stop();
echo „<BR>Trei!”;
Rezultatul acestui script include cuvintele unu ºi doi, dar nu ºi cuvântul trei. Prin apelarea funcþiei stop() se executã corpul funcþiei respective; la invocarea funcþiei, exit(), execuþia scriptului se încheie.
110
<titlu>Funcþii recursive</titlu>
Este posibil ca o funcþie din PHP sã se auto-apeleze. O funcþie care procedeazã astfel se numeºte funcþie recursivã. Totuºi, dacã nu aþi studiat informatica, este recomandabil sã nu scrieþi funcþii recursive. Cu toate acestea, puteþi scrie accidental o asemenea funcþie, deci este util sã ºtiþi unele noþiuni referitoare la aceasta.
Programul urmãtor defineºte ºi invocã o funcþie recursivã simplã:
function recursor()

return recursor();

$x = recursor();
La invocarea funcþiei recursor(), aceasta invocã imediat funcþia recursor(), care se auto-invocã instantaneu. Astfel, funcþia recursor() este invocatã în mod repetat, pânã când se produce o eroare cunoscuta sub numele de depãºire în sens pozitiv a stivei, (stack overflow). Dacã programul dumneavoastrã se încheie cu o depãºire în sens pozitiv a stivei, o posibilã cauzã poate consta într-o recursie incorectã.
<titlu>Definirea argumentelor prestabilite</titlu>
PHP 4 vã permite sã definiþi funcþii cu argumente prestabilite. Dacã invocaþi o funcþie care are un argument prestabilit, dar nu furnizaþi nici o valoare pentru argumentul respectiv, argumentul ia o valoare prestabilitã specificatã. Iatã un exemplu simplu:
function impozit_vanzari($cantitae , $rata = 0.0725)

echo „<BR>cantitate=$cantitate”;
echo „<BR>rata=$rata”;
return $suma * $rata;

$cumparaturi = 123.45;
echo „<BR>cumparaturi = $cumparaturi”;
$impozit = impozit_vanzari($cumparaturi,0.08);
echo „<BR>impozit = $impozit”;
$cumparaturi = 123.45;
echo „<BR>cumparaturi = $cumparaturi”;
$impozit = impozit_vanzari($cumparaturi);
echo „<BR>impozit = $impozit”;
Funcþia impozit_vanzari preia douã argumente: un argument obligatoriu, denumit $cantitate, ºi un argument prestabilit, denumit $rata. Dacã apelaþi funcþia ºi furnizaþi un singur argument, valoarea argumentului respectiv se considerã ca fiind valoarea argumentului $cantitate, iar valoarea 0.0725 se foloseºte ca valoare a argumentului $rata. Astfel, la prima invocare a funcþiei, $rata are valoarea 0.08,
111
specificatã drept al doilea argument al funcþiei.Cu toate acestea, la a doua invocare a funcþiei, $rata are valoarea 0.0725 deoarece este specificatã valoarea unui singur argument.
<Sfatul specialistului>
Întrebare: Este posibil ca o funcþie sã aibã mai multe argumente prestabilite? Rãspuns: Da, dar rezultatul este deseori confuz. De exemplu sã considerãm urmãtorul antet de funcþie:
function doua_rele($timp = 1, $spatiu = 2)
Care trebuie sã fie rezultatul dacã este invocatã urmãtoarea funcþie?
x = doua rele(3);
Cu alte cuvinte, argumentul trebuie folosit ca valoare a variabilei $timp sau ca valoare a variabilei $spatiu? PHP are reguli care controleazã asemenea situaþii, dar regulile respective pot fi derutante.Ca atare, cel mai bine este sã evitaþi problema prin definirea unui singur argument prestabilit ºi prin poziþionarea unui argument prestabilit pe ultima poziþie în lista cu arumente. </Sfatul specialistului>
<Test „la minut>
• Scrieþi definiþia unei funcþii care calculeazã aria unui cerc, dacã se cunoaºte raza acestuia.
• Scrieri definiþia unei funcþii care are ca date de ieºire blocul <HEAD> al unei pagini HTML, incorporând în cadrul unui bloc <TITLE> ºirul dat ca argument al funcþiei. </Test „la minut>
<notã>
Rãspunsuri la test
•function arie_circulara($raza)

return 3.14159 * $raza *$raza
}
• function bloc_antet($titlu)

echo "<HEAD>\n”;
echo „<TITLE>$titlu</TITLE\n”>
echo "</HEAD>\n";
}
</notã>
112
<titlu>Variabile ºi referinþe PHP</titlu>
Variabilele PHP sunt de douã tipuri principale:
• Variabile globale
• Variabile locale
Variabilele globale sunt create în exteriorul oricãrei funcþii, în timp ce variabilele locale sunt create în interiorul unei funcþii. Aceastã secþiune descrie variabilele globale ºi locale, precum ºi referinþele, care constituie o modalitate specialã de referire la o variabilã.
<titlu>Utilizarea variabilelor globale</titlu>
Aºa cum s-a explicat anterior, variabilele globale sunt declarate în afara oricãrei funcþii. Variabilele de formular reprezintã un tip important de variabile globale. Cu toate acestea, puteþi crea o variabilã globalã atribuindu-i acesteia o valoare, atâta timp cât instrucþiunea de atribuire respectivã nu se aflã în interiorul corpului unei funcþii.
Totalitatea locurilor unde este accesibilã o variabilã se numeºte domeniu de existenþã al variabilei. În mod prestabilit, variabilele globale nu pot fi accesibile din interiorul corpului unei funcþii; cu alte cuvinte, domeniul de existentã al unei variabile globale, nu include corpurile funcþiilor. Dacã doriþi sã obþineþi accesul la o variabilã globalã în cadrul unei funcþii, puteþi extinde domeniul de existenþã al variabilei prin specificarea numelui variabilei în interiorul unei instrucþiuni global. Instrucþiunea global are urmãtoarea formã:
Global variabila1, variabila2, variabila3
Dupã cuvântul cheie global pot urma una sau mai multe variabile; fiecare variabilã este separatã de vecina sa prin intermediul unei virgule. Iatã un exemplu care prezintã modul de funcþionare a instrucþiunii global:
function nu_este_global()

echo „<BR>nuglobal: x=$x”;

function este_global()

global $x;
echo „<BR>global: x=$x”;

$x = 1;
nu_este_global();
este_global;
Dacã rulaþi acest script, veþi primi urmãtoarele rezultate:
nuglobal: x =
global: x = 1
113
Reþineþi cã variabila $x primeºte numele unei valori în afara corpului oricãreia dintre funcþii; cu alte cuvinte, $x este o variabilã globalã, în consecinþã, variabila $x nu se aflã în cadrul domeniului de existenþã al funcþiei nu_este_global() ºi, în consecinþã, instrucþiunea echo din cadrul funcþiei nu_este_global() nu afiºeazã nici o valoare. Cu toate acestea, funcþia este_global() conþine o instrucþiune global care extinde domeniul de existenþã al variabilei $x; ca atare, instrucþiunea echo din cadrul funcþiei este_global() afiºeazã valoarea variabilei $x.
<titlu>Utilizarea variabilelor locale ºi a variabilelor statice</titlu>
Domeniul de existentã, care descrie unde este disponibilã o anumitã variabilã, reprezintã o importantã caracteristicã a variabilelor. O altã caracteristicã importantã este durata de viaþã, care descrie când este disponibilã o anumitã variabilã.
Variabilele globale sunt create atunci când li se atribuie o valoare ºi existã pe durata unui program. Spre deosebire de acestea, variabilele locale sunt create la apelarea funcþiei asociate ºi sunt distruse la încheierea apelului la funcþia respectivã. În consecinþã, variabilele locale sunt disponibile numai pe durata execuþiei funcþiei asociate.
Argumentele funcþiilor constituie un tip important de variabilã locala. Cu toate acestea, puteþi crea o variabilã localã prin simpla atribuire a unei valori unei variabile din interiorul unei funcþii. Pentru a ilustra deosebirea dintre variabilele locale ºi cele globale, iatã un script care defineºte o variabilã localã denumitã $x ºi o variabilã globalã cu acelaºi nume:
function are_local()

$x = 2;
echo „<BR>In corpul functiei: x = $x”;

$x = 1
echo „<BR>In corpul scriptutlui: x = $x”;
are_local();
echo „<BR>In corpul scriptului: x = $x”;
În cazul în care rulaþi acest script, veþi primi urmãtoarele rezultate:
În corpul scriptului: x = 1
În corpul functiei: x = 2
În corpul scriptului: x = 1
Remarcaþi diferenþa dintre cele douã variabile, chiar dacã numele variabilelor este acelaºi. Domeniul de existentã al variabilei globale $x nu se extinde în interiorul corpului funcþiei are_local(), iar domeniul de existenþã al variabilei locale $x nu se extinde dincolo de corpul funcþiei respective. Cu alte cuvinte, domeniile de existenþã ale celor douã variabile sunt complet distincte ºi, ca atare, PHP nu poate confunda valorile variabilelor respective.
114
Uneori, doriþi ca o variabilã localã sã-ºi pãstreze valoarea de la un apel al funcþie asociate la altul. Altfel spus, nu doriþi ca variabila sã fie distrusã la încheierea apelului la funcþie. Puteþi folosi instrucþiunea static pentru a specifica acest comportament. Forma instrucþiunii static este similarã cu aceea a instrucþiunii global, cu excepþia utilizãrii cuvântului cheie static în locul cuvântului cheie global. O variabilã afiºatã într-o instrucþiune static este cunoscutã sub numele de variabilã localã staticã, sau, mai concis, variabilã staticã. Iatã un exemplu care prezintã modul de utilizare a unei variabile statice:
function nu_este_static();

$x = $x  1;
echo „<BR>x=$x

function este_static();

static $x;
$x = $x  1;
echo „<BR>x=$x

nu_este_static();
nu_este_static();
nu_este_static();
este_static();
este_static();
este_static();
Dacã rulaþi acest script, veþi primi urmãtoarele rezultate:
x=1
x=1
x=1
x=1
x=2
x=3
Observaþi cã variabila localã $x, definitã în cadrul funcþiei nu_este_static(), este creata din nou la fiecare apelare a funcþiei, în consecinþã, valoarea sa este întotdeauna afiºatã ca fiind egalã cu 1. Prin contrast, variabila staticã $x, definitã în cadrul funcþiei este_static(), îºi pãstreazã valoarea de la un apel al funcþiei la urmãtorul; ca atare, valoarea sa creºte de fiecare datã când este executatã funcþia.
De asemenea, reþineþi cã domeniile de existenþã ale variabilei locale $x ºi ale variabilei statice $x sunt distincte; în consecinþã, valorile celor douã variabile sunt diferite, chiar dacã variabilele au acelaºi nume.
115
<titlu>Utilizarea referinþelor (PHP 4)</titlu>
In mod prestabilit, argumentele transferate unei funcþii PHP sunt transmise prin valoare, ceea ce înseamnã cã valorile argumentelor sunt copiate ºi funcþiile utilizeazã copii ale valorilor argumentelor lor, nu argumentele în sine. Ca o consecinþã, o funcþie PHP nu poate modifica valorile argumentelor sale. Acest fapt este în general util, deoarece astfel funcþiile devin mai uºor de înþeles dacã se limiteazã la a returna o valoare, fãrã a modifica valori.
Totuºi, puteþi stabili ca o funcþie sã aibã posibilitatea de a modifica valoarea unui argument, specificând ca argumentul sã fie transferat prin referinþã. Când un argument este transferat prin referinþã, valoarea sa nu este copiatã; funcþia lucreazã cu valoarea argumentului ºi are libertatea de a modifica acea valoare. Pentru a specifica faptul cã un argument urmeazã a fi transferat prin referinþã, argumentul va fi prefixat cu un caracter ampersand (&). Puteþi ataºa acest prefix la argument în antetul funcþiei sau în apelul la funcþie.
Iatã un exemplu care prezintã apelul prin valoare ºi apelul prin referinþã:
function prin_valoare($x)

$x = 1;

function prin_referinta(&$x)

$x = 1;

$y = 0
prin_valoare($y);
echo „<BR>\$y=$y”;
$y = 0
prin_valoare(&$y);
echo „<BR>\$y=$y”;
$y = 0
prin_referinta($y);
echo „<BR>\$y=$y”;
Dacã rulaþi acest script, veþi obþine urmãtoarele date de ieºire:
$y=0
$y=1
$y=1
Reþineþi cã scriptul conþine douã funcþii, ºi anume prin_valoare () ºi prin_referinta(). Fiecare funcþie preia un singur argument, denumit $x. Antetul funcþiei prin_referinta() specificã faptul cã argumentul sãu este transferat prin referinþã; argumentul funcþiei prin_valoare() este transferat prin valoare, în conformitate cu practica prestabilitã folosiþi în limbajul PHP.
116
Fiecare funcþie încearcã sã modifice valoarea argumentului sãu. Primul paragraf al programului invocã funcþia prin_valoare(), transferând argumentul prin valoare. În consecinþã, funcþia lucreazã cu o copie a argumentului sãu, iar valoarea variat $y nu se modificã.
Cel de-al doilea paragraf al programului invocã de asemenea funcþia prin_valoare(); cu toate acestea, foloseºte un caracter ampersand pentru a determina transferul referinþã al valorii variabilei $y. În consecinþã, funcþia modificã valoarea argumentului sãu, care se transformã din 0 în 1.
Cel de-a treilea paragraf al programului invocã funcþia prin_referinta(). Antetul funcþiei respective foloseºte un caracter ampersand pentru a specifica faptul cã valoarea argumentului sãu este transferatã prin referinþã, în consecinþã, funcþia modificã valoarea argumentului sãu, care se transformã din 0 în l.
<Sfatul specialistului>
Întrebare: De ce se folosesc referinþele sau apelurile prin referinþã?
Rãspuns: Prin utilizarea referinþelor se evitã suprasarcina de copiere a valorilor argumentelor ºi implicit se obþine o vitezã mai mare de execuþie a programului. Cu toate acestea, programele devin astfel mai dificil de înþeles, iar| referinþele sau apelurile prin referinþã pot cauza erori de program. Cel mai indicat este sã evitaþi referinþele, acolo unde este posibil, ºi sã definiþi funcþii care returneazã valori, ºi nu funcþii care modificã valorile propriilor argumente. Cu toate acestea, este important sã înþelegeþi noþiunile privind referinþele, astfel încât sã puteþi lucra cu programe scrise de programatori care nu respectã aceste sfaturi.
</Sfatul specialistului>
<Test „la minut">
• Scrieþi instrucþiunea care este necesarã într-o funcþie pentru a se putea obþine accesul la o variabilã denumitã $greutate creatã în afara funcþiei.
• Scrieþi instrucþiunea care determinã variabila locala $contor sã-ºi pãstreze valoarea la mai multe invocãri ale funcþiei asociate. </Test „la minut">
<titlu>Proiect 7-1: Revenire la formularul cu pei de contact</titlu>
În cadrul acestui proiect, veþi crea din nou formularul HTML ºi scriptul PHP intitulat „Proiect 6-2". Formularul permite unui utilizator sã introducã date personale de categoria celor folosite într-o agendã cu adrese de e-mail.
<notã>
Rãspunsuri la test:
• global $greutate;
• static $contor;</notã>
117
Scriptul PHP valideazã datele de intrare introduse de utilizator, asigurându-se cã au fost introduse date în câmpurile obligatorii.
<titlu>Scopurile proiectului</titlu>
• prezentarea modului de funcþionare a instrucþiunii include
• prezentarea modului de definire ºi creare a unei funcþii
• Prezentarea tehnicii racordurilor de program
<titlu>Pas cu pas</titlu>
1. Plasaþi urmãtorul script PHP într-un fiºier denumit p-7-1.php ºi încãrcaþi acest fiºier în serverul dumneavoastrã PHP:
<?php
include „p-7-1.inc”;
function validare_formular()

global $porecla, $prenume, $nume, $email;
$erori = 0;
if(!trim($porecla))

echo „<BR><B>Porecla</B>este obligatorie.”;
$erori++;

if(!trim($prenume))

echo „<BR><B>Prenumele</B>este obligatoriu.”;
$erori++;

if(!trim($nume))

echo „<BR><B>Numele</B>este obligatoriu.”;
$erori++;

if(!trim($email))

echo „<BR><B>Adresa primara de e-mail</B>”.
„este obligatorie.”;
$erori++;

switch($erori)

case 0:
return TRUE;
case 1:
echo „<BR><BR><BR>Va rugam folositi butonul „;
echo „Back al browserului dumneavoastra”;
echo „pentru a reveni la formular, „;
118
echo „corectati eroarea si”;
echo „ reexpediati formularul.”;
return FALSE;
default:
echo „<BR><BR><BR>Va rugam folositi butonul „;
echo „Back al browserului dumneavoastra”;
echo „pentru a reveni la formular, „;
echo „corectati eroarea si”;
echo „ reexpediati formularul.”;
return FALSE;


function actualizare_baza_de_date()

echo „<BR>Actualizeaza baza de date….”;

$ok = validare_formular();
if ($ok)
actualizare_baza_de_date();
?>
</BODY>
</HTML>
2. Plasaþi urmãtorul text HTML într-un fiºier denumit p-7-1 .inc ºi încãrcaþi acest fiºier în serverul dumneavoastrã, plasându-l în acelaºi catalog ca ºi fiºierul p-7-1 .php:
<HTML>
<HEAD>
<TITLE>Proiect 7-1</TITLE>
</HEAD>
</BODY>
3. Plasaþi urmãtorul text HTML într-un fiºier denumit p-7-1 .html ºi încãrcaþi acest fiºier în serverul dumneavoastrã, plasându-l în acelaºi catalog ca ºi fiºierul p-7-1 .php:
<HTML>
<HEAD>
<TITLE>Proiect p-7-1</TITLE>
</HEAD>
<!--Fisier p-7-1.html -->
<H1>Informatii privind persoana de contact</H1>
<TABLE>
<TR>
<TD><B>Porecla:</B></TD>
<TD><INPUT TYPE=”TEXT” NAME=”porecla”></TD>
</TR>
<TR>
<TD>Titlu:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”titlu”></TD>
</TR>
119
<TR>
<TD><B>Prenume:</B></TD>
<TD><INPUT TYPE=”TEXT” NAME=”prenume”></TD>
</TR>
<TR>
<TD>Prenumele tatalui:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”prenume_tata”></TD>
</TR>
<TR>
<TD><B>Nume:</B></TD>
<TD><INPUT TYPE=”TEXT” NAME=”Nume”></TD>
</TR>
<TR>
<TD><B>Adresa de e-mail principala:</B><TD>
<TD><INPUT TYPE=”TEXT” NAME”email”></TD>
<TD WIDTH=”20”> </TD>
<TD>Adresa de e-mail secundara:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”emailsecundar”></TD>
</TR>
<TR>
<TD>Numele companiei:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”nume_companie”></TD>
</TR>
<TR>
<TD>Adresa firmei:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”adresa_firmei1”></TD>
<TD WIDTH=”20”> </TD>
<TD>Adresa la domiciliu:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”adresa_acasa”></TD>
</TR>
<TR>
<TD></TD>
<TD><INPUT TYPE=”TEXT” NAME”adresa_firmei2”></TD>
</TR>
<TR>
<TD>Oras:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”oras_birou”></TD>
<TD WIDTH=”20”> </TD>
<TD> </TD>
<TD><INPUT TYPE=”TEXT” NAME=”oras_acasa”></TD>
</TR>
<TR>
<TD>Stat:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”stat_birou”></TD>
<TD WIDTH=”20”> </TD>
<TD> </TD>
<TD><INPUT TYPE=”TEXT” NAME=”stat_acasa”></TD>
</TR>
120
<TR>
<TD>Cod postal:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”cod_birou”></TD>
<TD WIDTH=”20”> </TD>
<TD> </TD>
<TD><INPUT TYPE=”TEXT” NAME=”cod_acasa”></TD>
</TR>
<TR>
<TD>Telefon:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”telefon_birou”></TD>
<TD WIDTH=”20”> </TD>
<TD> </TD>
<TD><INPUT TYPE=”TEXT” NAME=”telefon_acasa”></TD>
</TR>
<TR>
<TD>Data nasterii:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”data_nastere”></TD>
</TR>
<TR>
<TD>Numele sotului/sotiei:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”nume_sot”></TD>
<TD WIDTH=”20”> </TD>
<TD>Numele copiilor:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”copii”></TD>
</TR>
<TR>
<TD>Ziua nuntii:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”zi_nunta”></TD>
</TR>
</TABLE>
<BR>
<BR>
<BR>
<INPUT TYPE=”SUBMIT” VALUE=”Trimite”>
<BR>
<BR>
<INPUT TYPE=”RESET” VALUE=”Sterge datele”>
</FORM>
</BODY>
</HTML>
4. Alocaþi un timp studiului scriptului PHP. acordând o atenþie specialã modificãrilor operate în proiectul iniþial, prin care au fost incluse un fiºier de includere ºi anumite funcþii, în particular, observaþi cã funcþia actualizare_baza_de_date () conþine o singurã instrucþiune echo. O asemenea funcþie, cunoscutã sub numele de racord, este folositã în faza de dezvoltare a programului, astfel încât programul sã poatã fi rulat ºi testat chiar înainte de a fi fost scris în totalitate. Ulterior, corpul funcþiei actualizare_baza_de_date() va fi rafinat, urmând sã conþinã instrucþiuni care realizeazã efectiv actualizarea unei baze de date.
121
5. Orientaþi un browser Web spre adresa URL a fiºierului HTML încãrcat anterior. Ecranul browserului trebuie sã fie asemãnãtor celui prezentat în continuare. Introduceþi valori pentru mai multe câmpuri ºi apoi executaþi clic pe butonul Trimite.
<ecran>
<câmpuri>
Contact Information
NickName:
Title:
First Name:
Middle Name:
Last Name:
Primary Email: Secundary Email:
Company Name:
Office Address: Home Address:
City:
State:
Zip:
Phone:
Spouse Name: Childres Names:
Anniversary:
</câmpuri>
<buton> Submit</buton>
<buton>Clear the Form</buton>
</ecran>
6. La executarea scriptului, acesta verificã dacã porecla, prenumele, numele ºi adresa de e-mail sunt prezente. Dacã oricare dintre aceste câmpuri lipseºte, scriiptul afiºeazã un mesaj de eroare. Un rezultat caracteristic este prezentat în continuare.
<Ecran>
Primary email address is required
Please use your browser’s back button to return to the form, correct the error, and re-submit the form.
</Ecran>
<Test de evaluare>
1. Scrieþi o instrucþiune care invocã funcþia test(), transferând valorile l ºi 2 ca argumente.
2. Scrieþi o instrucþiune care invocã funcþia live(), transferând ca argumente valorile l ºi 2; asigurati-vã cã nu se vor genera mesaje de eroare în timpul execuþiei funcþiei.
122
3. Scrieþi o instrucþiune care include conþinutul fiºierului antet.php ca parte a scriptului curent.
4. Scrieþi definiþia unei funcþii numite patrat(), care calculeazã aria unui pãtrat, dacã este datã lungimea unei laturi a pãtratului.
5. Scrieþi o definiþie a unei funcþii denumite contor(), care incrementeazã ºi returneazã valoarea unei variabile locale statice.
</test de evaluare>