Variabile si referinte in functii


Variabilele functiilor in PHP sunt de doua tipuri principale:

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:

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.

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".

Utilizare functii <<-- Anterior --- Urmator -->> Data si Timpul

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Ce tag se foloseste pentru a crea o caseta de adaugare text?
<form> <input> <div>
<input type="text" name="a_name" value="val" />
Ce proprietate CSS se foloseste pentru a afisa textul cu majuscule-mici?
display font-variant font-style
h3 {
  font-variant: small-caps;
}
Ce instructiune afiseaza o fereastra cu un mesaj in ea?
for() Date() alert()
var msg = "Viziteaza CoursesWeb.net";
alert(msg);
Indicati codul PHP prin care se obtine IP-ul utilizatorului.
$_SERVER["HTTP_USER_AGENT"] $_SERVER["REMOTE_ADDR"] $_GET[]
$ip = $_SERVER["REMOTE_ADDR"];
echo $ip;
Cum se traduce cuvantul "actually"?
actual de fapt acum
He actually came on time.
- De fapt, el a venit la timp.
Cum se traduce expresia: "Hace buen tiempo"?
Face timp E vreme frumoasa Drum bun
Hoy hace buen tiempo.
- Astazi e vreme frumoasa.
Variabile si referinte in functii - Tutoriale PHP