Php7 - PHP: global în interiorul unei funcții nu arată o variabilă - Stack Overflow în rusă. Domeniul de aplicare al variabilelor PHP. Tot ce ai vrut să știi, dar ți-a fost teamă să întrebi Printează o variabilă globală php în afara unei funcții

Ultima actualizare: 1/11/2015

Când utilizați variabile și funcții, luați în considerare domeniul de aplicare al variabilei. Domeniul de aplicare specifică domeniul de acțiune și accesibilitatea unei variabile date.

Variabile locale

Variabilele locale sunt create în interiorul unei funcții. Astfel de variabile pot fi accesate numai dintr-o funcție dată. De exemplu:

În acest caz, funcția get() definește o variabilă locală $result . Și din contextul general nu îl putem accesa, adică scriem $a = $rezultat; Acest lucru nu este posibil deoarece domeniul de aplicare al variabilei $result este limitat de funcția get(). În afara acestei funcții, variabila $result nu există.

Același lucru este valabil și pentru parametrii funcției: în afara funcției, nici parametrii $lowlimit și $highlimit nu există.

De regulă, variabilele locale stochează unele rezultate intermediare ale calculelor, ca în exemplul de mai sus.

Variabile statice

Variabilele statice sunt similare cu variabilele locale. Ele diferă prin faptul că, după finalizarea funcției, valoarea lor este salvată. De fiecare dată când funcția este apelată, aceasta folosește valoarea stocată anterior. De exemplu:

Pentru a indica faptul că o variabilă va fi statică, i se adaugă cuvântul cheie static. Cu trei apeluri consecutive la getCounter(), variabila $counter va fi incrementată cu unu.

Dacă variabila $counter ar fi o variabilă obișnuită non-statică, atunci getCounter() ar afișa 1 de fiecare dată când a fost apelată.

De obicei, variabilele statice sunt folosite pentru a crea diverse contoare, ca în exemplul de mai sus.

Variabile globale

Uneori doriți ca o variabilă să fie disponibilă peste tot, la nivel global. Astfel de variabile pot stoca unele date comune întregului program. Pentru a defini variabile globale, utilizați cuvântul cheie global:1

"; ) getGlobal(); echo $gvar; ?>

După apelarea funcției getGlobal(), variabila $gvar poate fi accesată din orice parte a programului.

Nota: Este activată versiunea adaptivă a site-ului, care se adaptează automat la dimensiunea redusă a browserului dumneavoastră și ascunde câteva detalii ale site-ului pentru ușurință în citire. Vizionare placuta!

Salutare dragi cititori ai blogului Site pe! Am aflat că există o funcție în PHP, am învățat cum să ne creăm propriile funcții, să le transmitem argumente și să le apelăm pentru execuție. Continuând subiectul funcțiilor în PHP, este necesar să subliniem următoarele lucruri:

  • În interiorul funcției, puteți utiliza orice cod PHP (cicluri, condiții, orice operații), inclusiv alte funcții (atât încorporate, cât și personalizate);
  • Numele funcției trebuie să înceapă cu o literă latină sau o liniuță de subliniere, urmată de orice număr de litere, cifre sau liniuțe latine;
  • Toate funcțiile au sferă globală, ceea ce înseamnă că orice funcție poate fi apelată oriunde, chiar dacă acea funcție este definită în alta;
  • PHP nu acceptă supraîncărcarea funcțiilor; de asemenea, nu există posibilitatea de a redefini (schimba, adăuga) sau șterge o funcție creată;
  • Funcțiile nu trebuie să fie definite înainte de a fi utilizate. Adică, dacă apelați mai întâi o funcție și abia apoi o descrieți în codul de mai jos, acest lucru nu va afecta performanța și nu va provoca erori.

Funcții condiționale

Putem crea (defini, descrie) o funcție în funcție de condiție. De exemplu:

//a numit funcția sayHi, poate fi apelată oriunde /*funcția sayGoodbye nu poate fi apelată aici, deoarece încă nu am verificat condiția și nu am intrat în construcția if*/ if($aply)(funcția sayGoodbye())( echo „La revedere tuturor!
"; } } /*acum putem numi spune la revedere*/
"; }

Rezultat:

Și uită-te la acest exemplu:

/*și asta se va întâmpla dacă vei suna spune la revedere aici*/ spune la revedere(); if($aply)(funcția sayGoodbye())( echo „La revedere tuturor!
"; ) ) function sayHi())( echo "Bună ziua tuturor!
"; }

Rezultat:

De fapt, oricât de mult am lucrat, nu am văzut niciodată așa ceva nicăieri, dar trebuie să ții cont de toate posibilitățile limbii.

Funcții imbricate

O funcție imbricată este o funcție declarată în interiorul unei alte funcții. Exemplu:

/*Nu puteți apela sayGoodbye aici, deoarece va apărea numai după apelarea funcției sayHi*/ spune bună(); /*apelați funcția sayHi, poate fi apelată oriunde*/ /*Acum putem numi spune la revedere*/ spune la revedere(); function sayHi())( echo „Bună ziua tuturor!
"; funcția sayGoodbye())( echo "La revedere tuturor!
"; } }

Din nou, la prima traversare, interpretul PHP se marchează că a găsit o descriere a funcției sayHi, dar nu intră în corpul acesteia, vede doar numele și, deoarece interpretul nu intră în corpul sayHi, atunci nu are idee ce definim în interiorul unei alte funcții – sayGoodbye.

Apoi începe executarea codului, numim sayHi, interpretul PHP trebuie să intre în corpul funcției sayHi pentru a o executa și acolo găsește accidental descrierea unei alte funcții - sayGoodbye, după care sayGoodbye poate fi apelat oriunde, de câte ori. cum doriți.

Dar merită să acordați atenție unui punct foarte subtil din situația de mai sus: funcția sayHi devine o singură dată, deoarece dacă o numim din nou, PHP va întâlni din nou definiția funcției sayGoodbye, iar în PHP nu puteți face. asta - nu puteți suprascrie funcții. Am scris despre asta și cum să o rezolv într-un articol anterior.

În PHP, tehnicile descrise mai sus sunt folosite foarte rar; ele pot fi văzute mai des, de exemplu, în JavaScript.

Domeniu variabil

Există exact două domenii în PHP: globalȘi local. Fiecare limbaj de programare structurează domeniile în mod diferit. De exemplu, în C++, chiar și buclele au propriul domeniu de aplicare (local). În PHP, apropo, acesta este un domeniu global. Dar astăzi vorbim despre funcții.

Funcțiile din PHP au propriul domeniu intern (local), adică toate variabilele din interiorul unei funcții sunt vizibile doar în cadrul acestei funcții.

Deci, încă o dată: tot ce este în afara funcțiilor este sfera globală, tot ce este în interiorul funcțiilor este sfera locală. Exemplu:

Dragi experți, atenție, întrebare! Ce va scoate ultima instrucțiune? echo $nume; ?

După cum ați văzut singur, am avut 2 variabile $nume, unul în interiorul funcției (sfera locală), celălalt doar în cod (sfera globală), ultima atribuire unei variabile $nume a fost $name = "Rud Sergey"; Dar din moment ce era în interiorul funcției, a rămas acolo. În sfera globală, ultima misiune a fost $nume = "Andrey"; ceea ce vedem de fapt ca rezultat.

Adică două variabile identice, dar în domenii diferite nu se intersectează și nu se afectează reciproc.

Permiteți-mi să ilustrez domeniul de aplicare în figură:

În timpul primei traversări, interpretul scanează pe scurt domeniul global, își amintește ce variabile și funcții există, dar nu execută codul.

Accesarea variabilelor globale din domeniul local

Dar dacă mai trebuie să accesăm aceeași variabilă $name din domeniul global dintr-o funcție și nu doar să o accesăm, ci să o schimbăm? Există 3 opțiuni principale pentru aceasta. Prima este folosirea unui cuvânt cheie global:

"; global $nume; /*de acum înainte ne referim la variabila globală $nume*/$name = "Rud Sergey"; ) $name = "Andrey"; sayHi($nume); echo $nume; // ?

Rezultat:

Dar această metodă are un dezavantaj, deoarece am accesat variabila globală $nume am pierdut (suprascris) o variabilă locală $nume.

A doua cale este de a folosi Matrice superglobală PHP. PHP în sine plasează automat fiecare variabilă pe care am creat-o în domeniul global în această matrice. Exemplu:

$nume = "Andrey"; //La fel ca$GLOBALS["name"] = "Andrey";

Prin urmare:

"; $GLOBALS["name"] = "Rud Sergey"; ) $name = "Andrey"; sayHi($nume); echo $nume; // ?

Rezultatul este același cu utilizarea cuvântului cheie global:

Numai că de data aceasta nu am rescris variabila locală, adică variabila $numeîn interiorul funcției rămâne aceeași și este egală "Andrey", dar nu „Rud Sergey”.

Trecerea argumentelor prin referință

A treia cale– acesta este transferul de adresă ( link-uri) unei variabile, nu valoarea acesteia. Link-urile în PHP nu au mare succes, spre deosebire de alte limbaje de programare. Cu toate acestea, vă voi spune singura opțiune corectă pentru a trece un argument prin referire la o funcție, care este în mod normal acceptată în PHP 5.3 și mai sus. Există și alte modalități de a lucra cu link-uri, dar au funcționat în PHP 5.2 și mai puțin, ca urmare, dezvoltatorii PHP înșiși au decis să le abandoneze, așa că nu vom vorbi despre ele.

Deci, transmiterea CORECTĂ a unui argument prin referință în PHP 5.3 și versiuni ulterioare se face după cum urmează:

Funcția sayHi(& $name)(

În descrierea funcției în sine, am adăugat o pictogramă ampersand (&) - această pictogramă înseamnă că nu acceptăm valoarea variabilei, ci o legătură (adresă) către această valoare în memorie. Referințele în PHP vă permit să creați două variabile care indică aceeași valoare. Aceasta înseamnă că atunci când una dintre aceste variabile se modifică, ambele se schimbă, deoarece se referă la aceeași valoare în memorie.

Si pana la urma avem:

//nu acceptă o valoare, ci o referință la valoare echo „Bună ziua, „.$nume.”!
"; $nume = "Rud Sergey"; ) $nume = "Andrey"; sayHi($nume); echo $nume; // ?

Rezultat:

Variabile statice

Imaginați-vă următoarea situație: trebuie să numărăm de câte ori ne-am salutat în total. Iată ce încercăm să facem:

"; $c++; // crește contorul cu 1


Rezultat:

Variabil $c nu își amintește semnificația, este creat din nou de fiecare dată. Trebuie să facem variabila noastră locală $cși-au amintit valoarea după executarea funcției, pentru aceasta folosesc un cuvânt cheie static:

// contor, făcut static echo „Bună ziua, „.$nume.”!
"; $c++; // crește contorul cu 1 echo "Tocmai am salutat". $c . " o singura data.


"; ) sayHi ("Rud Sergey"); sayHi ("Andrey"); sayHi ("Dmitry");

Rezultat:

Valori returnate

Funcțiile au un lucru atât de convenabil ca returnarea valorilor. Acesta este momentul în care o funcție, în loc să imprime ceva pe ecran, pune totul într-o variabilă și ne oferă acea variabilă. Și deja decidem ce să facem cu el. De exemplu, să luăm această funcție, ea pune la pătrat un număr:

Rezultat:

Să facem astfel încât, în loc să-l afișeze pe ecran, să returneze rezultatul execuției. Pentru a face acest lucru, utilizați cuvântul cheie return:

Rezultat:

Acum îl putem folosi în diferite moduri:

//afișează rezultatul ecou"
"; $num = getSquare(5); echo $num;

Rezultat:

Vă rugăm să rețineți că cuvântul cheie întoarcere nu doar returnează o valoare, ci întrerupe complet funcția, adică tot codul care se află sub cuvântul cheie întoarcere nu va fi niciodată împlinită. Cu alte cuvinte, returnarea pentru funcții funcționează, de asemenea, ca pauză pentru bucle:

echo „PHP nu va ajunge niciodată la mine:(”;) echo getSquare(5); //afișează rezultatul ecou"
"; $num = getSquare(5); // a atribuit rezultatul unei variabile echo $num; // afișează variabila pe ecran

Rezultat:

Acesta este întoarcere– aceasta este și o ieșire din funcție. Poate fi folosit fără o valoare returnată, doar de dragul ieșirii.

Functie recursiva

O funcție recursivă este o funcție care se autoinvocă. Recursiunea nu este folosită des și este considerată o operațiune care necesită mult resurse (lentă). Dar se întâmplă că utilizarea recursiunii este cea mai evidentă și simplă opțiune. Exemplu:

"; dacă($număr< 20){ // pentru ca recursiunea să nu devină nesfârșită countPlease(++$number); // funcția countPlease s-a numit singură) ) countPlease(1);

Rezultat:

Dacă știi să faci fără recursivitate, atunci este mai bine să faci asta.

Tastare puternică în PHP (rafinament de tip)

PHP face pași mici către o tastare puternică, astfel încât să putem specifica în prealabil ce tip ar trebui să aibă o funcție (acesta se numește tip-hint):

Rezultat:

Eroare fatală interceptabilă: Argumentul 1 transmis către countPlease() trebuie să fie un tablou, întreg dat, numit în /home/index.php pe linia 7 și definit în /home/index.php pe linia 3

Eroarea ne spune că funcția se așteaptă să primească o matrice, dar în schimb îi transmitem un număr. Din păcate, deocamdată putem specifica doar tipul pentru (matrice), iar cu PHP 5.4 am adăugat și o astfel de opțiune ca apelabil:

Apelabil verifică dacă valoarea transmisă poate fi apelată ca funcție. Apelabil poate fi fie numele unei funcții specificate de o variabilă șir, fie un obiect și numele metodei care este apelată. Dar despre obiecte și metode vom vorbi mai târziu (aceasta este o secțiune de programare orientată pe obiecte), dar ești deja familiarizat cu funcțiile. Nu vă pot arăta rezultatul lucrării, deoarece în prezent am PHP 5.3, dar ar fi:

A numit funcția getEcho

Utilizarea argumentelor de lungime variabilă

Și în sfârșit, încă o nuanță foarte rar folosită. Imaginați-vă o situație: transmitem argumente unei funcții, deși nu le-am descris în funcție, de exemplu:

Rezultat:

După cum puteți vedea, nu există erori, dar argumentele noastre transmise nu sunt folosite nicăieri. Dar asta nu înseamnă că au dispărut - au fost încă trecute în funcție și le putem folosi; există funcții PHP încorporate pentru aceasta:

func_num_args()- Returnează numărul de argumente transmise funcției
func_get_arg(numărul secvenței)- Returnează un element dintr-o listă de argumente
func_get_args()- Returnează o matrice care conține argumentele funcției

"; echo func_get_arg(0) ; ) $varsta = 22; getEcho ("Rud Sergey", $varsta);

Rezultat:

Concluzie

Articolul de astăzi este cel final pe tema funcțiilor în PHP. Acum puteți avea încredere în caracterul complet al cunoștințelor dumneavoastră cu privire la acest subiect și puteți utiliza cu încredere funcțiile pentru nevoile dumneavoastră.

Dacă cineva dorește să devină mai bun, dar nu are idee cum să o facă, cel mai bun mod ar fi să scrieți funcții PHP gata făcute (încorporate), de exemplu, vă puteți scrie propria funcție count() sau oricare altul.

Vă mulțumesc tuturor pentru atenție și ne revedem! Dacă ceva nu este clar, nu ezitați să vă adresați întrebările în comentarii!

Acest tutorial acoperă domeniul de aplicare al variabilelor PHP. Explică diferența dintre domeniul local și global, arată cum să accesezi variabile globale într-o funcție, cum să lucrezi cu superglobale și cum să creezi variabile statice.

Când începeți să învățați PHP și începeți să lucrați cu funcții și obiecte, domeniul variabil este puțin confuz. Din fericire, regulile PHP în acest sens sunt foarte ușor de înțeles (comparativ cu alte limbaje de programare).

Ce este domeniul de aplicare?

Sfera variabilelor este contextul în care a fost definită variabila și unde poate fi accesată. PHP are două domenii variabile:

  • Global- variabilele pot fi accesate oriunde în script
  • Local- variabilele pot fi accesate numai în interiorul funcției în care au fost definite

Sfera de aplicare a unei variabile, și în special cea locală, simplifică foarte mult gestionarea codului. Dacă toate variabilele ar fi globale, atunci ele ar putea fi modificate oriunde în script. Acest lucru ar duce la haos și la scripturi mari, deoarece foarte adesea părți diferite ale scriptului folosesc variabile cu aceleași nume. Limitând domeniul de aplicare la contextul local, definiți limitele codului care poate accesa o variabilă, ceea ce face codul mai robust, modular și mai ușor de depanat.

Variabilele cu domeniu global sunt numite globale, iar variabilele cu domeniu local sunt numite locale.

Iată un exemplu despre cum funcționează variabilele globale și locale.

"; ) sayHello(); echo "Valoarea \$globalName: "$globalName"
„; echo „Valoare\$localName: „$localName”
"; ?>

Salut Harry! Valoarea $globalName: „Zoe” Valoarea $localName: „”

În acest script am creat două variabile:

  • $globalName- Acest global variabil
  • $localName- Acest local o variabilă care este creată în interiorul funcției sayHello().

După crearea variabilei și a funcției, scriptul apelează sayHello(), care afișează „Hello Harry!” . Scriptul încearcă apoi să scoată valorile celor două variabile folosind funcția echo. Iată ce se întâmplă:

  • Deoarece $globalName a fost creat în afara funcției, este disponibil oriunde în script, deci „Zoe” este afișat.
  • $localName va fi disponibil numai în cadrul funcției sayHello(). Deoarece expresia ecou este în afara funcției, PHP nu oferă acces la variabila locală. În schimb, PHP se așteaptă ca codul să creeze o nouă variabilă numită $localName , care va avea o valoare implicită a șirului gol. de aceea, al doilea apel la echo scoate valoarea „” pentru variabila $localName.

Accesarea variabilelor globale în interiorul unei funcții

Pentru a accesa o variabilă globală in afara functiei Este suficient să-i scrii numele. Dar pentru a accesa o variabilă globală în interiorul unei funcţii, mai întâi trebuie să declarați variabila ca globală în funcție folosind cuvântul cheie global:

Funcția myFunction() ( global $globalVariable; // Accesați variabila globală $globalVariable )

Dacă nu faceți acest lucru, PHP presupune că creați sau utilizați o variabilă locală.

Iată un exemplu de script care utilizează o variabilă globală în interiorul unei funcții:

"; global $globalName; echo "Bună ziua $globalName!
"; ) spune Bună (); ?>

Când este executat, scriptul va afișa:

Salut Harry! Salut Zoya!

Funcția sayHello() folosește cuvântul cheie global pentru a declara variabila $globalName ca fiind globală. Ea poate apoi accesa variabila și scoate valoarea acesteia („Zoe”).

Ce sunt superglobalii?

PHP are un set special de matrice globale predefinite care conțin diverse informații. Astfel de matrice sunt numite superglobali, deoarece sunt accesibile de oriunde în script, inclusiv spațiul de funcționare intern și nu trebuie să fie definite folosind cuvântul cheie global.

Iată o listă de superglobale disponibile în PHP versiunea 5.3:

  • $GLOBALS - listă cu toate variabilele globale din script (cu excepția superglobalelor)
  • $_GET - conține o listă a tuturor câmpurilor de formular trimise de browser folosind o solicitare GET
  • $_POST - conține o listă a tuturor câmpurilor de formular trimise de browser folosind o solicitare POST
  • $_COOKIE - conține o listă cu toate cookie-urile trimise de browser
  • $_REQUEST - conține toate combinațiile cheie/valoare care sunt conținute în tablourile $_GET, $_POST, $_COOKIE
  • $_FILES - conține o listă cu toate fișierele descărcate de browser
  • $_SESSION - vă permite să stocați și să utilizați variabile de sesiune pentru browserul curent
  • $_SERVER - conține informații despre server, cum ar fi numele fișierului scriptului care se execută și adresa IP a browserului.
  • $_ENV - conține o listă de variabile de mediu transmise PHP, cum ar fi variabilele CGI.
De exemplu, puteți utiliza $_GET pentru a obține valorile variabilelor incluse în șirul URL de solicitare a unui script și pentru a le afișa pe pagină:

Dacă rulați scriptul de mai sus folosind adresa URL http://www.example.com/script.php?yourName=Fred, va afișa:

Salut Fred!

Avertizare!Într-un script real, un astfel de transfer de date nu ar trebui să fie utilizat niciodată din cauza securității slabe. Ar trebui să validați sau să filtrați întotdeauna datele.

Superglobal $GLOBALS este foarte convenabil de utilizat deoarece vă permite să organizați accesul la variabile globale într-o funcție fără a fi nevoie de cuvântul cheie global. De exemplu:

"; ) sayHello(); // Afișează „Bună ziua, Zoya!” ?>

Variabile statice: sunt pe undeva

Când creați o variabilă locală în interiorul unei funcții, aceasta există doar în timp ce funcția rulează. Când funcția se termină, variabila locală dispare. Când funcția este apelată din nou, este creată o nouă variabilă locală.

În majoritatea cazurilor, acest lucru funcționează excelent. Astfel, funcțiile sunt autonome și funcționează întotdeauna la fel de fiecare dată când sunt apelate.

Cu toate acestea, există situații în care ar fi convenabil să se creeze o variabilă locală care „își amintește” valoarea între apelurile de funcții. O astfel de variabilă se numește static.

Pentru a crea o variabilă statică într-o funcție, trebuie să utilizați cuvântul cheie static înainte de numele variabilei și asigurați-vă că îi dați o valoare inițială. De exemplu:

Funcția myFunction() ( static $myVariable = 0; )

Să luăm în considerare o situație în care este convenabil să folosiți o variabilă statică. Să presupunem că creați o funcție care, atunci când este apelată, creează un widget și afișează numărul de widget-uri deja create. Puteți încerca să scrieți cod ca acesta folosind o variabilă locală:


"; echo createWidget() ." am creat deja.
"; echo createWidget() ." am creat deja.>
"; ?>

Dar, deoarece variabila $numWidgets este creată de fiecare dată când funcția este apelată, vom obține următorul rezultat:

Creăm câteva widget-uri... Am creat deja 1. Am creat deja 1. Am creat deja 1.

Dar folosind o variabilă statică, putem stoca valoarea de la un apel de funcție la altul:

"; echo createWidget() ." am creat deja.
"; echo createWidget() ." am creat deja.
"; echo createWidget() ." >am creat deja.
"; ?>

Acum scriptul va produce rezultatul așteptat:

Creăm câteva widget-uri... Am creat deja 1. Am creat deja 2. Am creat deja 3.

Deși o variabilă statică își păstrează valoarea între apelurile de funcție, este validă numai în timp ce scriptul rulează. Odată ce scriptul finalizează execuția, toate variabilele statice sunt distruse, la fel ca și variabilele locale și globale.

Asta e tot! Vă rugăm să consultați documentația PHP frecvent.

Lucrul de remarcat aici este că elementul de cod pe care l-ați prezentat ar trebui considerat ca design prost și stil de programare, deoarece tratează fișierul inclus ca pe un set de operații executabil instantaneu.

Cea mai corectă abordare ar fi să puneți setul de operații ca funcții/clase cu propriul nume într-un fișier, să includeți fișierul (fără nicio instrucțiune de returnare în afara funcțiilor) și apoi să apelați funcția evident cu setul necesar de argumente.

Deci care este problema?

Totul este extrem de simplu, tu o faci includeîn interiorul unei metode metodă, ceea ce înseamnă că variabilele specificate în fișierul inclus sunt inițializate în domeniul de aplicare al metodei metodă. Prin urmare, variabila $lang nu este globală și este limitat de vizibilitatea metodei, și accesați o variabilă globală, deci atunci când utilizați modificatorul global va fi egal cu nul.

Dacă includeți în domeniul global, atunci variabila lang va deveni publică (globală) și utilizarea acesteia va deveni posibilă. Acest lucru este ușor de verificat; în fișierul inclus, înainte de a începe să definiți orice variabilă, trebuie doar să scrieți global $variabila.

Exemplu:

includeți „file1.php”; funcția include2() (include „fișier2.php”; )
  • file1.php este definit în domeniul global.
  • file2.php este definit în domeniul local al funcției include2.

Abordarea cu variabile globale și asemenea include este o cârjă care vă va aduce probleme în viitor. Funcțiile trebuie să fie definite în mod explicit, să aibă un nume unic și să fie executate la cerere.

De ce este proastă abordarea cu variabile globale?

Ideea este că variabilele globale sunt vizibile de peste tot, la nivel global. Acest lucru este convenabil: nu există restricții. Pe de altă parte, devine complet imposibil de urmărit cine modifică datele. Schimbările necontrolate sunt primul lucru care îmi vine de obicei în minte când sunt întrebați de ce variabilele globale sunt proaste.

Să presupunem că aveți o funcție al cărei rezultat depinde de o variabilă globală. Îl suni, îl suni, dar după 10 minute funcția începe să returneze rezultate incorecte. Ce s-a întâmplat? La urma urmei, îi transmiteți același set de parametri ca intrare? Hmm, cineva a schimbat valoarea unei variabile globale... Cine ar putea fi? Da, oricine - la urma urmei, o variabilă globală este disponibilă pentru toată lumea..

Cea mai bună rețetă pentru proiectarea subrutinelor este: faceți rezultatul funcției dvs. să depindă numai de argumente. Acesta este un ideal pentru care să lupți.

Nu utilizați variabile globale în proiectul dvs. în mod inutil, profitați de toate caracteristicile domeniului local, trecând parametrii argumentelor funcției, iar codul va fi mai ușor de scris, întreținut și testat.

Știți care este cel mai bun prefix pentru variabilele globale?

Variabile definite într-o subrutină (funcție definită de utilizator). Sunt accesibile numai în cadrul funcției în care sunt definite.

Pentru PHP, toate variabilele declarate și utilizate într-o funcție sunt locale pentru funcție în mod implicit. Adică, implicit nu este posibilă modificarea valorii unei variabile globale în corpul unei funcții.

Dacă în corpul unei funcții definite de utilizator utilizați o variabilă cu un nume identic cu numele unei variabile globale (situată în afara funcției definite de utilizator), atunci această variabilă locală nu va avea nicio relație cu variabila globală. În această situație, o variabilă locală cu un nume identic cu numele variabilei globale va fi creată în funcția definită de utilizator, dar această variabilă locală va fi disponibilă numai în cadrul acestei funcții definite de utilizator.

Să explicăm acest fapt cu un exemplu specific:

$a = 100 ;

function function() (
$a = 70 ;
ecou"

$a

" ;
}
funcţie();
ecou"

$a

" ;
?>

Scriptul va imprima mai întâi 70 și apoi 100:

70
100

Pentru a scăpa de acest dezavantaj, există o instrucțiune specială în PHP global, permițând unei funcții definite de utilizator să lucreze cu variabile globale. Să ne uităm la acest principiu folosind exemple specifice:

$a = 1 ;
$b = 2 ;

Funcția Sum()
{
global $a, $b;

$b = $a + $b ;
}

Sumă();
echo $b ;
?>

Scriptul de mai sus va scoate „ 3 „. După definirea $aȘi $bîn interiorul funcției ca global toate referințele la oricare dintre aceste variabile vor indica versiunea lor globală. Nu există o limită a numărului de variabile globale care pot fi gestionate de funcțiile definite de utilizator.

A doua modalitate de a accesa variabilele globale este de a folosi o matrice specială definită de PHP $GLOBALE. Exemplul anterior ar putea fi rescris astfel:

Folosind $GLOBALS în loc de global:

$a = 1 ;
$b = 2 ;

Funcția Sum()
{
$GLOBALS [ "b" ] = $GLOBALS [ "a" ] + $GLOBALS [ "b" ];
}

Sumă();
echo $b ;
?>

$GLOBALE este un tablou asociativ a cărui cheie este numele și a cărui valoare este conținutul variabilei globale. Rețineți că $GLOBALS există în orice domeniu, aceasta deoarece aceasta este o matrice. Mai jos este un exemplu care demonstrează capacitățile superglobalilor:

funcția test_global()
{
// Majoritatea variabilelor predefinite nu sunt
// „super” și să fie disponibil în zona locală
// Vizibilitatea funcției necesită ca „global” să fie specificat.
global $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS[„nume”];

// Superglobals sunt disponibile în orice domeniu
// vizibilitate și nu necesită specificarea „global”.
// Superglobals disponibile începând cu PHP 4.1.0
echo $_POST ["nume"];
}
?>