duminică, 21 decembrie 2014

Domeniul de vizibilitate

Prin domeniul de vizibilitate (valabilitate) se intelege zona de program in care e valabila declararea sau definirea unui identificator. Toti indentificatorii definiti sau declarati intr-un bloc sunt cunoscuti in blocul respectiv si se numesc variabile locale. Daca blocul cuprinde blocuri incluse in care identificatorii (variabile locale ale acestora) nu se definesc sau redenumesc, atunci acestea sunt cunoscute in blocurile incluse si se numesc variabile globale pentru acesta. Daca o variabila declarata intr-un bloc se redefineste atunci in blocul in care a fost redeclarata va fi variabila atribuita generata la redeclarare.

Domeniul de vizibilitate al variabilelor
In PHP o variabila poate fi accesata doar in contextul in care a fost definita. De exemplu, o variabila definita in interiorul unei functii nu va putea fi accesata decat de instructiunile din interiorul acelei functii. Mai mult, in mod implicit, o variabila definita in exteriorul unei functii nu va putea fi accesata in interiorul functiei chiar daca ea nu este redefinita in cadrul functiei.
Pentru ca o functie sa aiba acces la o variabila definita in afara ei, variabila trebuie redeclarata ca variabila globala in interiorul functiei.
Sa consideram urmatorul exemplu:
Scriptul PHP
Rezultatul scriptului
<?php
    $a = 1;
    function test () {
      echo $a;
    }
    test ();
?>
Eroare
Observam ca nu se afiseaza valoarea 1 deoarece instructiunea echo $a se refera la variabila locala $a care nu este definita, deci nu are nici o valoare. In continuare, este o versiune in care instructiunea echo $a va accesa variabila $a definita in afara functiei test ():
Scriptul PHP
Rezultatul scriptului
<?php
    $a = 1;
    function test () {
      global $a;
      echo $a;
    }
    test ();
?>
1
O a doua posibilitate de a accesa o variabila definita in afara functiei este folosirea vectorului $GLOBALS:

Scriptul PHP
Rezultatul scriptului
<?php
    $a = 1;
    function test () {
      echo $GLOBALS ["a"];
    }
    test ();
?>
1

Niciun comentariu:

Trimiteți un comentariu