Php7 - PHP: globalno unutar funkcije ne prikazuje varijablu - Stack Overflow na ruskom. Opseg PHP varijabli. Sve što ste želeli da znate, ali ste se plašili da pitate Štampajte globalnu php promenljivu van funkcije

Posljednje ažuriranje: 1.11.2015

Kada koristite varijable i funkcije, razmotrite opseg varijabli. Opseg specificira opseg akcije i dostupnost date varijable.

Lokalne varijable

Lokalne varijable se kreiraju unutar funkcije. Takvim varijablama se može pristupiti samo iz date funkcije. Na primjer:

U ovom slučaju, funkcija get() definira lokalnu varijablu $result. I iz opšteg konteksta ne možemo mu pristupiti, to jest, pisati $a = $result; Ovo nije moguće jer je opseg varijable $result ograničen funkcijom get(). Izvan ove funkcije, varijabla $result ne postoji.

Isto vrijedi i za parametre funkcije: izvan funkcije, parametri $lowlimit i $highlimit također ne postoje.

U pravilu, lokalne varijable pohranjuju neke međurezultate proračuna, kao u gornjem primjeru.

Statičke varijable

Statičke varijable su slične lokalnim varijablama. Razlikuju se po tome što se nakon završetka funkcije njihova vrijednost sprema. Svaki put kada se funkcija pozove, ona koristi prethodno pohranjenu vrijednost. Na primjer:

Da bi se naznačilo da će varijabla biti statična, dodaje joj se ključna riječ static. Sa tri uzastopna poziva getCounter(), varijabla $counter će se povećati za jedan.

Ako je varijabla $counter obična nestatička varijabla, onda bi getCounter() ispisao 1 svaki put kada je pozvana.

Obično se statičke varijable koriste za kreiranje različitih brojača, kao u gornjem primjeru.

Globalne varijable

Ponekad želite da varijabla bude dostupna svuda, globalno. Takve varijable mogu pohraniti neke podatke zajedničke za cijeli program. Da biste definirali globalne varijable, koristite globalnu ključnu riječ:1

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

Nakon poziva funkcije getGlobal(), varijabli $gvar može se pristupiti iz bilo kojeg dijela programa.

Napomena: Aktivirana je adaptivna verzija stranice koja se automatski prilagođava maloj veličini vašeg pretraživača i skriva neke detalje stranice radi lakšeg čitanja. Uživajte u gledanju!

Pozdrav dragi čitaoci bloga Site on! Saznali smo da postoji funkcija u PHP-u, naučili smo kako da kreiramo sopstvene funkcije, da im prenesemo argumente i pozovemo ih na izvršenje. Nastavljajući temu funkcija u PHP-u, potrebno je naglasiti sljedeće stvari:

  • Unutar funkcije možete koristiti bilo koji PHP kod (cikluse, uslove, bilo koje operacije), uključujući i druge funkcije (i ugrađene i prilagođene);
  • Ime funkcije mora početi latiničnim slovom ili donjom crtom, nakon čega slijedi bilo koji broj latiničnih slova, brojeva ili podvlaka;
  • Sve funkcije imaju globalni opseg, što znači da se bilo koja funkcija može pozvati bilo gdje, čak i ako je ta funkcija definirana unutar druge;
  • PHP ne podržava preopterećenje funkcija, također ne postoji mogućnost redefiniranja (promjene, dodavanja) ili brisanja kreirane funkcije;
  • Funkcije ne moraju biti definirane prije nego što se koriste. To jest, ako prvo pozovete funkciju, a tek onda je opišete u kodu ispod, to neće utjecati na performanse i neće uzrokovati greške.

Uslovne funkcije

Možemo kreirati (definirati, opisati) funkciju ovisno o uvjetu. Na primjer:

//pozvana funkcija sayHi, može se pozvati bilo gdje /*funkcija sayGoodbye se ne može pozvati ovdje, jer još nismo provjerili uvjet i nismo ušli u if konstrukciju*/ if($apply)( funkcija sayGoodbye())( echo "Zbogom svima!
"; } } /*sada možemo nazvati sayGoodbye*/
"; }

rezultat:

I pogledajte ovaj primjer:

/*a ovo će se desiti ako nazoveš say Goodbye ovdje*/ reci zbogom(); if($apply)( funkcija sayGoodbye())( echo "Zbogom svima!
"; ) ) funkcija sayHi())( echo "Pozdrav svima!
"; }

rezultat:

Zapravo, koliko sam radio, nigdje nisam vidio ovako nešto, ali morate imati na umu sve mogućnosti jezika.

Ugniježđene funkcije

Ugniježđena funkcija je funkcija deklarirana unutar druge funkcije. primjer:

/*Ovdje ne možete pozvati sayGoodbye, jer će se pojaviti tek nakon pozivanja funkcije sayHi*/ pozdravi(); /*pozovite funkciju sayHi, može se pozvati bilo gdje*/ /*Sada možemo nazvati sayGoodbye*/ reci zbogom(); funkcija sayHi())( echo "Zdravo svima!
"; funkcija sayGoodbye())( echo "Zbogom svima!
"; } }

Opet, pri prvom obilasku, PHP interpreter označava sebe da je pronašao opis funkcije sayHi, ali ne ulazi u njeno tijelo, vidi samo ime, a pošto interpreter ne ulazi unutar tijela sayHi, onda nema pojma šta definišemo unutar druge funkcije – sayGoodbye.

Tada počinje izvršavanje koda, mi zovemo sayHi, PHP interpreter mora ući u tijelo sayHi funkcije da bi je izvršio i tamo slučajno pronađe opis druge funkcije - sayGoodbye, nakon čega se sayGoodbye može pozvati bilo gdje, koliko puta kako želite.

Ali vrijedi obratiti pažnju na vrlo suptilnu tačku u gornjoj situaciji: funkcija sayHi postaje jednokratna, jer ako je ponovo pozovemo, PHP će ponovo naići na definiciju sayGoodbye funkcije, a u PHP-u to ne možete učiniti ovo - ne možete nadjačati funkcije. O tome i kako se nositi s tim pisao sam u prethodnom članku.

U PHP-u se gore opisane tehnike koriste vrlo rijetko; češće se mogu vidjeti, na primjer, u JavaScript-u.

Varijabilni opseg

U PHP-u postoje tačno dva opsega: globalno I lokalni. Svaki programski jezik ima različitu strukturu opsega. Na primjer, u C++, čak i petlje imaju svoj vlastiti (lokalni) opseg. U PHP-u, inače, ovo je globalni opseg. Ali danas govorimo o funkcijama.

Funkcije u PHP-u imaju svoj interni opseg (lokalni), to jest, sve varijable unutar funkcije su vidljive samo unutar ove funkcije.

Dakle, još jednom: sve izvan funkcija je globalni opseg, sve unutar funkcija je lokalni opseg. primjer:

Dragi stručnjaci, pažnja, pitanje! Šta će izaći posljednja instrukcija? echo $name; ?

Kao što ste sami vidjeli, imali smo 2 varijable $name, jedan unutar funkcije (lokalni opseg), drugi samo u kodu (globalni opseg), posljednja dodjela varijabli $name bio $name = "Rud Sergey"; Ali pošto je bio unutar funkcije, ostao je tamo. U globalnom obimu, posljednji zadatak je bio $name = "Andrej";što je ono što zapravo vidimo kao rezultat.

To jest, dvije identične varijable, ali se u različitim opsegima ne sijeku i ne utiču jedna na drugu.

Dozvolite mi da ilustrujem obim na slici:

Tokom prvog obilaska, tumač nakratko skenira globalni opseg, pamti koje varijable i funkcije postoje, ali ne izvršava kod.

Pristup globalnim varijablama iz lokalnog opsega

Ali šta ako još uvijek trebamo pristupiti istoj varijabli $name iz globalnog opsega iz funkcije, a ne samo da joj pristupimo, već da je promijenimo? Postoje 3 glavne opcije za ovo. Prvi je korištenje ključne riječi globalno:

"; globalno $name; /*od sada mislimo na globalnu varijablu $name*/$name = "Rud Sergey"; ) $name = "Andrej"; reciHi($name); echo $name; // ?

rezultat:

Ali ova metoda ima nedostatak, jer smo pristupili globalnoj varijabli $name izgubili smo (prepisali) lokalnu varijablu $name.

Drugi način je koristiti PHP superglobalni niz. Sam PHP automatski stavlja svaku varijablu koju smo kreirali u globalnom opsegu u ovaj niz. primjer:

$name = "Andrej"; //Isto kao$GLOBALS["name"] = "Andrej";

dakle:

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

Rezultat je isti kao i korištenje ključne riječi globalno:

Samo ovaj put nismo prepisali lokalnu varijablu, odnosno varijablu $name unutar funkcije ostaje ista i jednaka je "Andrej", ali ne "Rud Sergey".

Prenošenje argumenata referencom

Treći način– ovo je prijenos adrese ( linkovi) varijable, a ne njene vrijednosti. Linkovi u PHP-u nisu baš uspešni, za razliku od drugih programskih jezika. Međutim, reći ću vam jedinu ispravnu opciju za prosljeđivanje argumenta referencom na funkciju, koja je normalno podržana u PHP-u 5.3 i novijim. Postoje i drugi načini rada sa vezama, ali oni su radili u PHP-u 5.2 i nižim, kao rezultat toga, sami PHP programeri su odlučili da ih napuste, tako da nećemo govoriti o njima.

Dakle, ISPRAVNO prosleđivanje argumenta po referenci u PHP-u 5.3 i novijim se radi na sledeći način:

Funkcija sayHi(& $name)(

U samom opisu funkcije dodali smo ikonicu ampersanda (&) - ova ikona znači da ne prihvatamo vrijednost varijable, već vezu (adresu) do ove vrijednosti u memoriji. Reference u PHP-u vam omogućavaju da kreirate dve varijable koje upućuju na istu vrednost. To znači da kada se jedna od ovih varijabli promijeni, obje se mijenjaju, jer se odnose na istu vrijednost u memoriji.

I na kraju imamo:

//prihvatamo ne vrijednost, već referencu na vrijednost echo "Zdravo, ".$name."!
"; $name = "Rud Sergey"; ) $name = "Andrej"; sayHi($name); echo $name; // ?

rezultat:

Statičke varijable

Zamislite sljedeću situaciju: trebamo izbrojati koliko puta smo se ukupno pozdravili. Evo šta pokušavamo učiniti:

"; $c++; // povećaj brojač za 1


rezultat:

Varijabilna $c ne pamti svoje značenje, svaki put se iznova stvara. Moramo napraviti našu lokalnu varijablu $c zapamtili svoju vrijednost nakon izvršavanja funkcije, za to koriste ključnu riječ statički:

// brojač, statičan echo "Zdravo, ".$name."!
"; $c++; // povećaj brojač za 1 echo "Upravo sam rekao zdravo " . $c . "jednom.


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

rezultat:

Povratne vrijednosti

Funkcije imaju tako zgodnu stvar kao što je vraćanje vrijednosti. To je kada funkcija, umjesto da ispisuje nešto na ekranu, sve stavlja u varijablu i daje nam tu varijablu. I već odlučujemo šta ćemo s tim. Na primjer, uzmimo ovu funkciju, ona kvadrira broj:

rezultat:

Napravimo tako da umjesto da se prikaže na ekranu, vraća rezultat izvršenja. Da biste to učinili, koristite ključnu riječ return:

rezultat:

Sada ovo možemo koristiti na različite načine:

//izlazi rezultat eho"
"; $num = getSquare(5); echo $num;

rezultat:

Imajte na umu da je ključna riječ povratak ne vraća samo vrijednost, već potpuno prekida funkciju, odnosno sav kod koji se nalazi ispod ključne riječi povratak nikada neće biti ispunjeno. Drugim riječima, povratak za funkcije također funkcionira kao break za petlje:

echo "PHP me nikada neće stići:(";) echo getSquare(5); //izlazi rezultat eho"
"; $num = getSquare(5); // dodijelio rezultat varijabli echo $num; // prikazuje varijablu na ekranu

rezultat:

To je povratak– ovo je također izlaz iz funkcije. Može se koristiti bez povratne vrijednosti, samo radi izlaza.

Rekurzivna funkcija

Rekurzivna funkcija je funkcija koja sama sebe poziva. Rekurzija se ne koristi često i smatra se resursno intenzivnom (sporom) operacijom. Ali dešava se da je korištenje rekurzije najočitija i najjednostavnija opcija. primjer:

"; if($broj< 20){ // tako da rekurzija ne postane beskonačna countPlease(++$broj); // funkcija countPlease pozvala je samu sebe) ) countPlease(1);

rezultat:

Ako znate kako to učiniti bez rekurzije, onda je bolje to učiniti.

Jako kucanje u PHP-u (pročišćavanje tipa)

PHP preduzima male korake ka snažnom kucanju, tako da možemo unapred odrediti koji tip funkcija treba da ima (ovo se zove type-hint):

rezultat:

Fatalna greška koja se može uhvatiti: Argument 1 proslijeđen countPlease() mora biti niz, dat cijeli broj, pozvan u /home/index.php na redu 7 i definiran u /home/index.php na redu 3

Greška nam govori da funkcija očekuje da će primiti niz, ali umjesto toga mi joj prosljeđujemo broj. Nažalost, za sada možemo samo odrediti tip za (niz), a sa PHP 5.4 smo dodali i opciju kao pozvati:

Poziv provjerava da li se proslijeđena vrijednost može pozvati kao funkcija. Poziv može biti ili ime funkcije specificirane promjenljivom stringom, ili objekt i ime metode koja se poziva. Ali o objektima i metodama ćemo govoriti kasnije (ovo je dio objektno orijentiranog programiranja), ali vi ste već upoznati sa funkcijama. Ne mogu vam pokazati rezultat rada, pošto trenutno imam PHP 5.3, ali bi to bilo:

Pozvana funkcija getEcho

Korištenje argumenata promjenjive dužine

I na kraju, još jedna vrlo rijetko korištena nijansa. Zamislite situaciju: prosljeđujemo argumente funkciji, iako ih nismo opisali u funkciji, na primjer:

rezultat:

Kao što vidite, nema grešaka, ali naši proslijeđeni argumenti se nigdje ne koriste. Ali to ne znači da su nestali - još uvijek su proslijeđeni u funkciju i možemo ih koristiti; za to postoje ugrađene PHP funkcije:

func_num_args()- Vraća broj argumenata proslijeđenih funkciji
func_get_arg(redni broj)- Vraća element sa liste argumenata
func_get_args()- Vraća niz koji sadrži argumente funkcije

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

rezultat:

Zaključak

Današnji članak je posljednji na temu funkcija u PHP-u. Sada možete biti sigurni u potpunost svog znanja o ovoj temi i sa sigurnošću možete koristiti funkcije za svoje potrebe.

Ako neko ima želju da se poboljša u tome, ali nema pojma kako to učiniti, najbolji način bi bio da napiše gotove (ugrađene) PHP funkcije, na primjer, možete napisati svoju count() funkciju ili bilo koji drugi.

Hvala svima na pažnji i vidimo se opet! Ako nešto nije jasno, slobodno postavite pitanja u komentarima!

Ovaj vodič pokriva opseg PHP varijabli. Objašnjava razliku između lokalnog i globalnog opsega, pokazuje kako pristupiti globalnim varijablama unutar funkcije, kako raditi sa superglobalima i kreirati statičke varijable.

Kada počnete da učite PHP i počnete da radite sa funkcijama i objektima, opseg varijable je pomalo zbunjujući. Na sreću, PHP-ova pravila u ovom pogledu su veoma laka za razumevanje (u poređenju sa drugim programskim jezicima).

Šta je opseg?

Opseg varijabli je kontekst unutar kojeg je varijabla definirana i gdje joj se može pristupiti. PHP ima dva promenljiva opsega:

  • Global- varijablama se može pristupiti bilo gdje u skripti
  • Lokalno- varijablama se može pristupiti samo unutar funkcije u kojoj su definirane

Opseg varijable, a posebno lokalne, uvelike pojednostavljuje upravljanje kodom. Kada bi sve varijable bile globalne, onda bi se mogle promijeniti bilo gdje u skripti. To bi dovelo do haosa i velikih skripti, jer vrlo često različiti dijelovi skripte koriste varijable s istim imenima. Ograničavajući opseg na lokalni kontekst, definirate granice koda koji može pristupiti varijabli, što čini kod robusnijim, modularnijim i lakšim za otklanjanje grešaka.

Varijable s globalnim opsegom nazivaju se globalnim, a varijable s lokalnim opsegom nazivaju se lokalnim.

Evo primjera kako funkcioniraju globalne i lokalne varijable.

"; ) sayHello(); echo "Vrijednost \$globalName: "$globalName"
"; echo "\$localName vrijednost: "$localName"
"; ?>

Zdravo Harry! $globalName vrijednost: "Zoe" $localName vrijednost: ""

U ovoj skripti kreirali smo dvije varijable:

  • $globalName- Ovo globalno varijabla
  • $localName- Ovo lokalni varijabla koja se kreira unutar funkcije sayHello().

Nakon kreiranja varijable i funkcije, skripta poziva sayHello(), koja ispisuje "Halo Harry!" . Skripta zatim pokušava ispisati vrijednosti dvije varijable koristeći echo funkciju. Evo šta se dešava:

  • Jer $globalName je kreiran izvan funkcije, dostupan je bilo gdje u skripti, tako da je "Zoe" izlaz.
  • $localName biće dostupan samo unutar funkcije sayHello(). Pošto je echo izraz izvan funkcije, PHP ne pruža pristup lokalnoj varijabli. Umjesto toga, PHP očekuje da kod kreira novu varijablu pod nazivom $localName, koja će imati zadanu vrijednost praznog niza. zato drugi poziv echo-a daje vrijednost "" za varijablu $localName.

Pristup globalnim varijablama unutar funkcije

Za pristup globalnoj varijabli van funkcije Dovoljno je samo napisati njeno ime. Ali za pristup globalnoj varijabli unutar funkcije, prvo morate deklarirati varijablu kao globalnu u funkciji koristeći globalnu ključnu riječ:

Funkcija myFunction() (globalna $globalVariable; // Pristup globalnoj varijabli $globalVariable)

Ako to ne učinite, PHP pretpostavlja da kreirate ili koristite lokalnu varijablu.

Evo primjera skripte koja koristi globalnu varijablu unutar funkcije:

"; globalno $globalName; echo "Zdravo $globalName!
"; ) reciHello(); ?>

Kada se izvrši, skripta će ispisati:

Zdravo Harry! Zdravo Zoya!

SayHello() funkcija koristi globalnu ključnu riječ da proglasi varijablu $globalName globalnom. Ona tada može pristupiti varijabli i ispisati njenu vrijednost (“Zoe”).

Šta su superglobali?

PHP ima poseban skup unapred definisanih globalnih nizova koji sadrže različite informacije. Takvi nizovi se nazivaju superglobali, budući da im se može pristupiti s bilo kojeg mjesta u skripti, uključujući interni funkcijski prostor, i ne moraju biti definirani korištenjem globalne ključne riječi.

Evo liste superglobala dostupnih u PHP verziji 5.3:

  • $GLOBALS - lista svih globalnih varijabli u skripti (isključujući superglobalne)
  • $_GET - sadrži listu svih polja obrasca koje je pretraživač dostavio koristeći GET zahtjev
  • $_POST - sadrži listu svih polja obrasca koje pretraživač šalje pomoću POST zahtjeva
  • $_COOKIE - sadrži listu svih kolačića koje šalje pretraživač
  • $_REQUEST - sadrži sve kombinacije ključ/vrijednost koje se nalaze u nizovima $_GET, $_POST, $_COOKIE
  • $_FILES - sadrži listu svih datoteka koje je preuzeo pretraživač
  • $_SESSION - omogućava vam da pohranite i koristite varijable sesije za trenutni pretraživač
  • $_SERVER - sadrži informacije o serveru, kao što je naziv datoteke skripte koja se izvršava i IP adresa pretraživača.
  • $_ENV - sadrži listu varijabli okruženja proslijeđenih PHP-u, kao što su CGI varijable.
Na primjer, možete koristiti $_GET da dobijete vrijednosti varijabli zatvorenih u URL nizu zahtjeva skripte i prikažete ih na stranici:

Ako pokrenete gornju skriptu koristeći URL http://www.example.com/script.php?yourName=Fred, ona će ispisati:

Hello Fred!

Upozorenje! U stvarnoj skripti, takav prijenos podataka nikada ne bi trebao biti korišten zbog slabe sigurnosti. Uvijek trebate provjeriti ili filtrirati podatke.

Superglobalni $GLOBALS je vrlo zgodan za korištenje jer vam omogućava da organizirate pristup globalnim varijablama u funkciji bez potrebe za globalnom ključnom riječi. Na primjer:

"; ) sayHello(); // Ispisuje "Zdravo, Zoya!" ?>

Statičke varijable: one su negdje u blizini

Kada kreirate lokalnu varijablu unutar funkcije, ona postoji samo dok je funkcija pokrenuta. Kada se funkcija završi, lokalna varijabla nestaje. Kada se funkcija ponovo pozove, kreira se nova lokalna varijabla.

U većini slučajeva ovo odlično funkcionira. Dakle, funkcije su samostalne i uvijek rade isto svaki put kada se pozovu.

Međutim, postoje situacije u kojima bi bilo zgodno kreirati lokalnu varijablu koja "pamti" svoju vrijednost između poziva funkcije. Takva varijabla se naziva statična.

Da biste kreirali statičku varijablu u funkciji, morate koristiti ključnu riječ static prije imena varijable i obavezno joj dati početnu vrijednost. Na primjer:

Funkcija myFunction() (statička $myVariable = 0;)

Razmotrimo situaciju kada je zgodno koristiti statičku varijablu. Recimo da kreirate funkciju koja, kada se pozove, kreira widget i prikazuje broj već kreiranih widgeta. Možete pokušati napisati ovakav kod koristeći lokalnu varijablu:


"; echo createWidget() . " smo već kreirali.
"; echo createWidget() . " već smo kreirali.>
"; ?>

Ali, pošto se varijabla $numWidgets kreira svaki put kada se funkcija pozove, dobit ćemo sljedeći rezultat:

Kreiramo neke vidžete... Već smo kreirali 1. Već smo kreirali 1. Već smo kreirali 1.

Ali korištenjem statičke varijable možemo pohraniti vrijednost iz jednog poziva funkcije u drugi:

"; echo createWidget() . " smo već kreirali.
"; echo createWidget() . " smo već kreirali.
"; echo createWidget() . " >već smo kreirali.
"; ?>

Sada će skripta proizvesti očekivani rezultat:

Kreiramo neke vidžete... Već smo kreirali 1. Već smo kreirali 2. Već smo kreirali 3.

Iako statička varijabla zadržava svoju vrijednost između poziva funkcije, ona je važeća samo dok je skripta pokrenuta. Kada skripta završi izvršavanje, sve statičke varijable se uništavaju, kao i lokalne i globalne varijable.

To je sve! Često pogledajte vašu PHP dokumentaciju.

Ono što ovdje treba napomenuti je da element koda koji ste predstavili treba smatrati kao loš dizajn i stil programiranja, jer tretira uključenu datoteku kao trenutno izvršni skup operacija.

Najispravniji pristup bi bio staviti skup operacija kao funkcije/klase s vlastitim imenom u datoteku, uključiti datoteku (bez ikakvog povratnog iskaza izvan funkcija), a zatim pozvati funkciju očigledno sa potrebnim skupom argumenata.

U čemu je problem?

Sve je krajnje jednostavno, uradite to uključiti unutar metode metoda, što znači da su varijable navedene u uključenoj datoteci inicijalizirane u opsegu metode metoda. Dakle, varijabla $lang nije globalno i ograničena je vidljivošću metode, a pristupate globalnoj varijabli, pa kada koristite modifikator globalno to će biti jednako nuli.

Ako uključite u globalni opseg, tada će varijabla lang postati javna (globalna) i njena upotreba će postati moguća. Ovo je lako provjeriti; u uključenu datoteku, prije nego počnete definirati bilo koju varijablu, samo napišite globalna $varijabla.

primjer:

uključiti "file1.php"; funkcija uključuje2() (uključuje "file2.php"; )
  • file1.php je definiran u globalnom opsegu.
  • file2.php je definiran u lokalnom opsegu funkcije include2.

Pristup s globalnim varijablama i slično je štaka koja će vam donijeti probleme u budućnosti. Funkcije moraju biti eksplicitno definirane, imati jedinstveno ime i izvršavati se na zahtjev.

Zašto je pristup sa globalnim varijablama loš?

Poenta je da su globalne varijable vidljive svuda, globalno. Ovo je zgodno: nema ograničenja. S druge strane, postaje potpuno nemoguće pratiti ko mijenja podatke. Nekontrolisane promjene su prva stvar koja vam obično padne na pamet kada se pita zašto su globalne varijable loše.

Recimo da imate funkciju čiji rezultat zavisi od globalne varijable. Zovete je, zovete, ali nakon 10 minuta funkcija počinje da vraća netačne rezultate. Šta se desilo? Na kraju krajeva, prosljeđujete mu isti skup parametara kao ulaz? Hmm, neko je promenio vrednost globalne varijable... Ko bi to mogao biti? Da, bilo ko - na kraju krajeva, globalna varijabla je dostupna svima.

Najbolji recept za dizajniranje potprograma je: učinite da rezultat vaše funkcije ovisi samo o argumentima. Ovo je ideal kojem treba težiti.

Nemojte nepotrebno koristiti globalne varijable u svom projektu, iskoristite sve karakteristike lokalnog opsega, prosljeđujući parametre argumentima funkcije, i kod će biti lakše pisati, održavati i testirati.

Znate li koji je najbolji prefiks za globalne varijable?

Varijable definirane unutar potprograma (korisnički definirana funkcija). Oni su dostupni samo unutar funkcije u kojoj su definirani.

Za PHP, sve varijable deklarirane i korištene u funkciji su po defaultu lokalne za funkciju. To jest, po defaultu nije moguće promijeniti vrijednost globalne varijable u tijelu funkcije.

Ako u tijelu korisnički definirane funkcije koristite varijablu s imenom identičnim imenu globalne varijable (koja se nalazi izvan korisnički definirane funkcije), tada ova lokalna varijabla neće imati nikakav odnos s globalnom varijablom. U ovoj situaciji, lokalna varijabla s imenom identičnim imenu globalne varijable će biti kreirana u korisnički definiranoj funkciji, ali će ova lokalna varijabla biti dostupna samo unutar ove korisnički definirane funkcije.

Objasnimo ovu činjenicu na konkretnom primjeru:

$a = 100;

funkcija funkcija() (
$a = 70;
eho"

$a

" ;
}
funkcija();
eho"

$a

" ;
?>

Skripta će prvo ispisati 70, a zatim 100:

70
100

Da biste se riješili ovog nedostatka, postoji posebna instrukcija u PHP-u globalno, omogućavajući korisnički definiranoj funkciji da radi s globalnim varijablama. Pogledajmo ovaj princip koristeći konkretne primjere:

$a = 1;
$b = 2;

Funkcija Sum()
{
globalno $a, $b;

$b = $a + $b;
}

Suma();
echo $b ;
?>

Gornja skripta će ispisati " 3 Nakon definiranja $a I $b unutar funkcije like globalno sve reference na bilo koju od ovih varijabli će upućivati ​​na njihovu globalnu verziju. Ne postoji ograničenje za broj globalnih varijabli kojima se može rukovati korisnički definiranim funkcijama.

Drugi način za pristup varijablama globalnog opsega je korištenje specijalnog PHP-definiranog niza $GLOBALS. Prethodni primjer bi se mogao prepisati ovako:

Korištenje $GLOBALS umjesto globalnog:

$a = 1;
$b = 2;

Funkcija Sum()
{
$GLOBALS [ "b" ] = $GLOBALS [ "a" ] + $GLOBALS [ "b" ];
}

Suma();
echo $b ;
?>

$GLOBALS je asocijativni niz čiji je ključ ime i čija je vrijednost sadržaj globalne varijable. Imajte na umu da $GLOBALS postoji u bilo kojem opsegu, to je zato što je ovo niz. Ispod je primjer koji pokazuje sposobnosti superglobala:

funkcija test_global()
{
// Većina predefiniranih varijabli nije
// "super" i biti dostupan u lokalnom području
// vidljivost funkcije zahtijeva da se navede "global".
globalni $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS["name"];

// Superglobali su dostupni u bilo kojem opsegu
// vidljivost i ne zahtijevaju da se navede "global".
// Superglobali dostupni od PHP 4.1.0
echo $_POST ["name"];
}
?>