Globalne varijable u PHP-u. Php varijabla vidljivosti opseg varijabla vidljivost u funkcijama

Zadnja izmjena: 1.11.2015

Kada koristite varijable i funkcije, razmotrite opseg varijable. Opseg specificira opseg djelovanja i dostupnost dane varijable.

Lokalne varijable

Lokalne varijable stvaraju se unutar funkcije. Takvim se varijablama može pristupiti samo unutar određene funkcije. Na primjer:

U ovom slučaju funkcija get() definira lokalnu varijablu $result. A iz općeg konteksta ne možemo mu pristupiti, odnosno napišite $a = $result; To 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 izračuna, kao u gornjem primjeru.

Statičke varijable

Statičke varijable slične su 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:

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

Kad bi varijabla $counter bila obična nestatička varijabla, tada bi getCounter() ispisao 1 svaki put kada bi bio pozvan.

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

Globalne varijable

Ponekad želite da varijabla bude dostupna posvuda, globalno. Takve varijable mogu pohraniti neke podatke zajedničke cijelom programu. Za definiranje globalnih varijabli upotrijebite ključnu riječ global:1

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

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

Opseg varijable je kontekst u kojem je ta varijabla definirana. Većina PHP varijabli ima jedan opseg. Ovaj pojedinačni opseg (koji se naziva i globalni opseg) također pokriva uključene datoteke:

U ovom primjeru, varijabla $a također će biti dostupna unutar uključene skripte - main.inc.

Lokalne varijable

Definicija prilagođene funkcije određuje lokalni opseg za varijablu, tj. Svaka varijabla koja se koristi unutar funkcije prema zadanim je postavkama ograničena na lokalni opseg funkcije (dostupna samo unutar funkcije u kojoj je definirana). Kako to radi: za odvajanje varijabli koje se koriste u općem kodu od varijabli koje se koriste u funkcijama, PHP osigurava zasebnu pohranu za varijable unutar svake funkcije. Ova podjela prostora za pohranu implicira da je opseg, odnosno područje u kojem je vrijednost varijable dostupna, lokalna pohrana funkcije.

Primjer u nastavku jasno pokazuje da se varijabla deklarirana izvan funkcije ne mijenja unutar funkcije. Iako ne biste trebali pokušavati razumjeti kako funkcija radi, glavna stvar je da ima svoj jedinstveni skup varijabli:

30 ?>

Kao rezultat izvršavanja ovog fragmenta, prikazat će se sljedeće: 30.

Unutar funkcije birth(), varijabla $age postavljena je na 1, ali to nije ista varijabla koja je definirana u globalnom opsegu. Stoga, kada se ispisuje vrijednost varijable $age, ispisuje se izvorna vrijednost od 30. Vrijedno je napomenuti da se lokalne varijable stvaraju u trenutku pozivanja funkcije i brišu se nakon što funkcija završi.

Ako zapravo želite čitati ili promijeniti vrijednost globalne varijable (kako se zovu varijable koje se koriste u globalnom opsegu), a ne lokalne unutar funkcije birth(), ona mora biti deklarirana kao globalna unutar definicije funkcije.

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

Pozdrav dragi čitatelji bloga stranica na! Naučili smo da u PHP-u postoji funkcija, naučili smo kako kreirati vlastite funkcije, proslijediti im argumente i pozvati 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, uvjete, sve operacije), uključujući druge funkcije (i ugrađene i prilagođene);
  • Naziv funkcije mora započeti latiničnim slovom ili podvlakom, 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 u nastavku, to neće utjecati na performanse i neće uzrokovati pogreške.

Uvjetne funkcije

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

//poziva se funkcija sayHi, može se pozvati bilo gdje /*funkcija sayGoodbye ne može se pozvati ovdje, budući da još nismo provjerili uvjet i nismo ušli u if konstrukciju*/ if($apply)( function sayGoodbye())( echo "Ćao svima!
"; } } /*sada možemo nazvati sayGoodbye*/
"; }

Proizlaziti:

A pogledajte ovaj primjer:

/*i ovo će se dogoditi ako ovdje nazoveš sayGoodbye*/ reci zbogom(); if($apply)( function sayGoodbye())( echo "Ćao svima!
"; ) ) funkcija sayHi())( echo "Pozdrav svima!
"; }

Proizlaziti:

Zapravo, koliko god radim, ovako nešto nisam nigdje vidio, ali treba 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*/ pozdraviti(); /*pozovite funkciju sayHi, može se pozvati bilo gdje*/ /*Sada možemo nazvati sayGoodbye*/ reci zbogom(); funkcija sayHi())( echo "Pozdrav svima!
"; funkcija sayGoodbye())( echo "Zbogom svima!
"; } }

Opet, pri prvom obilasku, PHP tumač označava sebe da je pronašao opis sayHi funkcije, ali ne ulazi u njeno tijelo, vidi samo ime, a budući da tumač ne ulazi u tijelo sayHi, tada nema pojma što definiramo unutar druge funkcije – sayGoodbye.

Tada se kod počinje izvršavati, 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 god puta kako hoćeš.

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

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

Opseg varijable

Postoje točno dva opsega u PHP-u: globalno I lokalni. Svaki programski jezik različito strukturira opsege. Na primjer, u C++, parne petlje imaju vlastiti (lokalni) opseg. Usput, u PHP-u je ovo globalni opseg. Ali danas govorimo o funkcijama.

Funkcije u PHP-u imaju svoj interni opseg (lokalni), odnosno sve varijable unutar funkcije vidljive su samo unutar te same funkcije.

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

Poštovani stručnjaci, pažnja, pitanje! Što će zadnja instrukcija ispisati? echo $name; ?

Kao što ste i sami vidjeli, imali smo 2 varijable $ime, jedan unutar funkcije (lokalni opseg), drugi samo u kodu (globalni opseg), zadnja dodjela varijabli $ime bio je $name = "Rud Sergey"; Ali budući da je bio unutar funkcije, tu je i ostao. U globalnom opsegu, posljednja dodjela bila je $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 utječu jedna na drugu.

Dopustite mi da ilustriram opseg na slici:

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

Pristup globalnim varijablama iz lokalnog opsega

Ali što ako i dalje trebamo pristupiti istoj $name varijabli iz globalnog opsega iz funkcije, i ne samo joj pristupiti, već je promijeniti? Za to postoje 3 glavne mogućnosti. Prvi je korištenje ključne riječi globalno:

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

Proizlaziti:

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

Drugi način je koristiti PHP superglobalni niz. Sam PHP automatski smješta svaku varijablu koju smo stvorili u globalnom opsegu u ovaj niz. Primjer:

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

Stoga:

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

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

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

Prosljeđivanje argumenata prema referenci

Treći način– ovo je prijenos adrese ( poveznice) varijable, a ne njezine vrijednosti. Linkovi u PHP-u nisu baš uspješ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 inače podržana u PHP 5.3 i novijim verzijama. Postoje i drugi načini rada s vezama, ali oni su radili u PHP-u 5.2 i nižim, kao rezultat toga, sami PHP programeri odlučili su ih napustiti, pa nećemo govoriti o njima.

Dakle, ISPRAVNO prosljeđivanje argumenta prema referenci u PHP-u 5.3 i novijim verzijama radi se na sljedeći način:

Funkcija sayHi(& $name)(

U samom opisu funkcije dodali smo ikonu ampersand (&) - ova ikona znači da ne prihvaćamo vrijednost varijable, već vezu (adresu) na tu vrijednost u memoriji. Reference u PHP-u omogućuju vam stvaranje dvije varijable koje pokazuju na istu vrijednost. 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:

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

Proizlaziti:

Statičke varijable

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

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


Proizlaziti:

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

// brojač, napravljen statičnim echo "Zdravo, ".$name."!
"; $c++; // povećaj brojač za 1 echo "Upravo sam te pozdravio" . $c . " jednom.


"; ) zdravo ("Rud Sergej"); zdravo ("Andrej"); zdravo ("Dmitrij");

Proizlaziti:

Povratne vrijednosti

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

Proizlaziti:

Učinimo to tako da umjesto prikaza na ekranu, vraća rezultat izvršenja. Da biste to učinili, upotrijebite ključnu riječ return:

Proizlaziti:

Sada ovo možemo koristiti na razne načine:

//ispisuje rezultat jeka "
"; $num = getSquare(5); echo $num;

Proizlaziti:

Imajte na umu da 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 nikad se neće ispuniti. Drugim riječima, povratak za funkcije također funkcionira kao pauza za petlje:

echo "PHP nikada neće doći do mene:(";) echo getSquare(5); //ispisuje rezultat jeka "
"; $num = getSquare(5); // dodijelio rezultat varijabli echo $num; // prikaz varijable na ekranu

Proizlaziti:

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

Rekurzivna funkcija

Rekurzivna funkcija je funkcija koja poziva samu sebe. Rekurzija se ne koristi često i smatra se operacijom koja zahtijeva mnogo resursa (sporom). No događa se da je korištenje rekurzije najočitija i najjednostavnija opcija. Primjer:

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

Proizlaziti:

Ako znate kako raditi bez rekurzije, onda je bolje da to učinite.

Snažno tipkanje u PHP-u (pročišćavanje tipa)

PHP poduzima male korake prema snažnom tipkanju, tako da možemo unaprijed odrediti koji bi tip funkcija trebala imati (ovo se zove tip-hint):

Proizlaziti:

Uhvatljiva fatalna pogreška: Argument 1 proslijeđen countPlease() mora biti niz, dan cijeli broj, pozvan u /home/index.php na retku 7 i definiran u /home/index.php na retku 3

Pogreška nam govori da funkcija očekuje primanje niza, ali umjesto toga mi joj prosljeđujemo broj. Nažalost, za sada možemo odrediti samo tip za (niz), a s PHP 5.4 dodali smo i opciju kao pozivivi:

Poziv provjerava može li se proslijeđena vrijednost pozvati kao funkcija. Callable može biti ili naziv funkcije specificirane string varijablom ili objekt i naziv metode koja se poziva. Ali kasnije ćemo govoriti o objektima i metodama (ovo je odjeljak objektno orijentiranog programiranja), ali već ste upoznati s funkcijama. Ne mogu vam pokazati rezultat rada, jer trenutno imam PHP 5.3, ali bio bi:

Zove se funkcija getEcho

Korištenje argumenata promjenjive duljine

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

Proizlaziti:

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 s popisa argumenata
func_get_args()- Vraća niz koji sadrži argumente funkcije

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

Proizlaziti:

Zaključak

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

Ako netko ima želju postati bolji u tome, ali nema pojma kako to učiniti, najbolji način bi bio napisati gotove (ugrađene) PHP funkcije, na primjer, možete napisati vlastitu count() funkciju ili bilo koji drugi.

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

Opseg varijable je kontekst u kojem je varijabla definirana. U većini slučajeva sve PHP varijable imaju samo jedan opseg. Ovaj jedinstveni opseg također pokriva uključene i potrebne datoteke. Na primjer:

$a = 1;
uključi "b.inc" ;
?>

Ovdje će varijabla $a biti dostupna unutar uključene b.inc skripte. Međutim, definicija (tijelo) korisnički definirane funkcije specificira lokalni opseg te funkcije. Svaka varijabla koja se koristi unutar funkcije prema zadanim je postavkama ograničena na lokalni opseg funkcije. Na primjer:

$a = 1; /* globalni opseg */

Test funkcije()
{
odjek $a ; /* referenca na varijablu lokalnog opsega */
}

Test();
?>

Ova skripta neće generirati nikakav izlaz jer naredba echo ukazuje na lokalnu verziju varijable $a i nije joj dodijeljena vrijednost unutar tog opsega. Možda ste primijetili da se ovo malo razlikuje od C-a po tome što su globalne varijable u C-u automatski dostupne funkcijama osim ako nisu prebrisane lokalnom definicijom. To može uzrokovati probleme jer ljudi mogu slučajno promijeniti globalnu varijablu. U PHP-u, ako se globalna varijabla koristi unutar funkcije, ona mora biti deklarirana kao globalna unutar definicije funkcije.

Ključna riječ globalno

Prvo primjer korištenja globalno:

Primjer #1 Korištenje globalno

$a = 1;
$b = 2;

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

$b = $a + $b ;
}

Iznos();
odjek $b ;
?>

Gornja skripta će ispisati 3 . Nakon što su $a i $b unutar funkcije definirani kao globalni, sve reference na bilo koju od ovih varijabli upućivat će na njihovu globalnu verziju. Ne postoji ograničenje broja globalnih varijabli koje funkcija može obraditi.

Drugi način pristupa varijablama globalnog opsega je korištenje posebnog niza definiranog u PHP-u, $GLOBALS. Prethodni primjer mogao bi se prepisati ovako:

$GLOBALS je asocijativni niz čiji je ključ ime, a vrijednost sadržaj globalne varijable. Imajte na umu da $GLOBALS postoji u bilo kojem opsegu, to je zato što je $GLOBALS superglobalan. Ispod je primjer koji pokazuje mogućnosti superglobala:

Primjer #3 Superglobali i opseg

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

Echo $HTTP_POST_VARS["ime"];

// Superglobali su dostupni u bilo kojem opsegu
// vidljivost i ne zahtijevaju navođenje "globalnog".
// Superglobali su dostupni od PHP 4.1.0, i
// upotreba HTTP_POST_VARS je zastarjela.
echo $_POST ["ime"];
}
?>

Komentar:

Upotreba ključnih riječi globalno izvan funkcije nije greška. Može se koristiti u datoteci koja je uključena unutar funkcije.

Korištenje statičkih ( statički) varijable

Druga važna značajka varijabilnog opsega je statički varijabla. Statička varijabla postoji samo u lokalnom opsegu funkcije, ali ne gubi svoju vrijednost kada izvođenje programa napusti taj opseg. Razmotrite sljedeći primjer:

Primjer #4 Demonstriranje potrebe za statičkim varijablama

test funkcije()
{
$a = 0;
odjek $a ;
$a++;
}
?>

Ova funkcija je prilično beskorisna jer svaki put kada se pozove postavlja $a na 0 i izlazi 0 . Povećanje varijable $a ++ ovdje ne igra ulogu, budući da varijabla $a nestaje kada funkcija izađe. Za pisanje korisne funkcije brojanja koja ne gubi trenutnu vrijednost brojača, varijabla $a se deklarira kao statična:

Primjer #5 Primjer korištenja statičkih varijabli

test funkcije()
{
statički $a = 0 ;
odjek $a ;
$a++;
}
?>

Sada će se $a inicijalizirati samo pri prvom pozivu funkcije i svakom pozivu funkcije test()će ispisati vrijednost $a i povećati je.

Statičke varijable također omogućuju rad s rekurzivnim funkcijama. Rekurzivna funkcija je ona koja poziva samu sebe. Kada pišete rekurzivnu funkciju, morate biti oprezni jer postoji mogućnost da rekurzija postane beskonačna. Morate osigurati da postoji odgovarajući način za prekid rekurzije. Sljedeća jednostavna funkcija rekurzivno broji do 10, koristeći statičku varijablu $count da odredi kada treba stati:

Komentar:

Statičke varijable mogu se deklarirati kao što je prikazano u prethodnom primjeru. Pokušaj dodjeljivanja vrijednosti ovim varijablama koje su rezultat izraza izazvat će pogrešku obrade.

Primjer #7 Deklaracija statičkih varijabli

funkcija foo ()(
statički $int = 0; // desno
statički $int = 1 + 2 ; // netočno (budući da je to izraz)
statički $int = sqrt(121); // netočno (budući da je ovo također izraz)

$int++;
echo $int;
}
?>

Komentar:

Statičke deklaracije se procjenjuju tijekom kompilacije skripte.

Veze s globalnim ( globalno) i statički ( statički) varijable

Zend Engine 1, koji pokreće PHP 4, tretira modifikatore statičkih i globalnih varijabli kao reference. Na primjer, stvarna globalna varijabla ugrađena u opseg funkcije navođenjem ključne riječi globalno, zapravo stvara referencu na globalnu varijablu. To može dovesti do neočekivanog ponašanja, kao što je prikazano u sljedećem primjeru:

funkcija test_global_ref() (
globalni $obj ;
$obj = &nova stdklasa ;
}

funkcija test_global_noref() (
globalni $obj ;
$obj = nova stdklasa;
}

test_global_ref();
var_dump($obj);
test_globalni_noref();
var_dump($obj);
?>

Rezultat pokretanja ovog primjera: get_instance_noref () (
statički $obj ;

Jeka "Statični objekt: ";
var_dump($obj);
if (!isset($obj )) (
// Dodijelite objekt statičkoj varijabli
$obj = nova stdklasa;
}
$obj -> svojstvo++;
povratak $obj ;
}

$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n" ;
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>

Rezultat pokretanja ovog primjera:

Statički objekt: NULL
Statički objekt: NULL

Statički objekt: NULL
Statički objekt: object(stdClass)(1) (
["property"]=>
int (1)
}

Ovaj primjer pokazuje da kada dodijelite referencu statičkoj varijabli, ona to ne čini nezaboravan kada pozovete funkciju &get_instance_ref() drugi put.

Da biste izradili potpunu web stranicu sa širokim rasponom funkcija, morate znati puno. Međutim, PHP može web stranici dati stvarnu jedinstvenost. Globalna varijabla se ne koristi često u ovom programskom jeziku, ali ponekad je vrlo korisno znati kako radi.


U ovom ćemo članku točno proučiti što je globalna varijabla i kako funkcionira.

Globalna varijabla: opseg

Kontekst unutar kojeg je definirana varijabla naziva se njezin opseg. Tipično, varijable imaju samo jedan opseg. Kada se globalne varijable u PHP-u učitavaju iz drugih datoteka, mogu se zahtijevati ili uključiti. Oni su prema zadanim postavkama ograničeni na lokalni opseg funkcije. Kako možete učiniti varijablu vidljivom datotekama izvan njezinih granica i moći je koristiti? Upravo zbog toga PHP nudi globalnu varijablu. Ključna riječ ovdje je "globalno". Kako deklarirati globalnu varijablu u PHP-u? Da bi se postigao ovaj cilj, mora se koristiti riječ "globalno". Mora se postaviti neposredno ispred varijable koju želite učiniti globalnom. To izgleda otprilike ovako: globalna "varijabla". Nakon implementacije uputa ove vrste, apsolutno svaka datoteka će moći raditi s podacima.

Ako negdje postoje reference na ovu varijablu, program će obratiti pozornost na globalnu verziju. Zašto se koristi tako čudna formulacija? Stvar je u tome što u isto vrijeme mogu postojati i lokalne inačice. No bit će dostupniji isključivo u datotekama u kojima su deklarirani. Za ostalo će se primjenjivati ​​globalne PHP varijable klase. Ovdje morate djelovati vrlo pažljivo i pažljivo. Da spriječimo bilo kakve nedoumice, dajmo jednostavan primjer kako bi mogli izgledati: globalno a. Ako jedna datoteka ima pristup više varijabli, to može uzrokovati sukob. Ali ovdje je nemoguće sa sigurnošću reći hoće li se pročitati globalna ili lokalna varijabla ili će doći do pogreške. Ako ga napišete unutar funkcije, ne bi trebalo biti problema. Korištenje varijable izvan granica funkcije bit će problematično. Stoga morate vrlo pažljivo pratiti strukturu koda i uvjeriti se da nigdje nema preduvjeta za sukob.

Globalne varijable: Još jedna notacija
Postoje li drugi načini za postavljanje globalnih varijabli? Da, i ne sam. Pogledajmo prvo $GLOBALS. To je asocijativni niz u kojem je ključ ime. Kao vrijednost koristi se sadržaj globalne varijable. Vrijedno je napomenuti da nakon deklaracije ovaj niz postoji u bilo kojem opsegu. To daje osnovu da se smatra superglobalnim. Izgleda ovako: $GLOBALS ['Varijabla'].

Superglobali
U svakom programskom jeziku postoje nazivi koji su rezervirani za pojedine funkcije. Jednostavno nije moguće stvoriti globalne varijable istog imena u PHP-u. Ovaj programski jezik ima svoje karakteristike. Na primjer, posebno je važno da unaprijed definirane varijable nemaju prefiks "super". To znači da nisu dostupni na svim lokacijama. Kako se ova situacija može ispraviti? Kako bi predefinirana varijabla bila dostupna na nekoj lokalnoj mreži, morate je deklarirati ovako: globalna "varijabla". Ovo je već ranije spomenuto. Međutim, to nije posve točno. Pogledajmo pravi primjer:
Globalni $HTTP_POST_VARS; echo $HTTP_POST_VARS ['ime'].
Osjećate li razliku? Vrijedno je imati na umu da se u PHP-u globalna varijabla mora koristiti unutar funkcije. Također se može nalaziti u datoteci koja je uključena u njega.

Sigurnost i veze
Kao što vidite i sami, stvaranje globalne varijable u PHP-u nije problem. Ali postoje li neke specifičnosti u vezi s poveznicama? Pri korištenju globalnih varijabli moguće je neočekivano ponašanje. Ali prije nego što detaljnije proučite ovo pitanje, potrebno je okrenuti se pozadini. Direktiva register_globals promijenjena je iz omogućene u onemogućenu prema zadanim postavkama u verziji 4.2. Za mnoge korisnike to je potpuno nevažno i uzalud, jer sigurnost proizvoda koji se razvija izravno ovisi o tome. Ako trebate napraviti globalnu varijablu, tada PHP direktiva neće izravno utjecati na ovu postavku. Međutim, nepravilna uporaba može postati sigurnosni rizik. Tako, na primjer, ako je register_globals u omogućenom stanju, tada će se razne potrebne varijable inicijalizirati prije nego što se kod izvrši. Stoga su ga odlučili ugasiti. Zašto globalna varijabla velik dio svog stanja duguje danoj direktivi? Problem je što kada je omogućeno, programeri nisu uvijek mogli odgovoriti na pitanje odakle dolazi, ali s druge strane, to je uvelike olakšalo proces pisanja koda. Istodobno, takva je organizacija stvorila određenu prijetnju sigurnosti. Kako bi se izbjeglo miješanje podataka i pogreške, direktiva je onemogućena. Sada pogledajmo primjer nesigurnog koda. Također ćemo pogledati kako možete otkriti slučajeve kada je deklaracija PHP globalne varijable popraćena pokušajem zamjene informacija. Ovo je potrebno kako bi se stvorile stabilne radne stranice koje ne može hakirati prvi korisnik koji na njih naiđe.

Opasni kodovi
Postavimo varijablu na true za one korisnike koji su ovlašteni:
If (authenticate_user()) ($authoriza=true;) if ($authorize) ( uključi “/highly/sensitive/data.php”;). Varijabla u ovom stanju može se postaviti automatski. S obzirom da se podaci mogu jednostavno zamijeniti, a izvor njihovog porijekla nije utvrđen, onda praktički svaki korisnik može proći takvu provjeru i lažno predstavljati bilo koga. Napadač, po želji, može poremetiti logiku cijele skripte. Ako promijenite vrijednost direktive, kod će raditi ispravno. To je upravo ono što trebamo učiniti. Međutim, inicijaliziranje varijabli nije samo dobra praksa među programerima, ono također jamči stabilnost skripte.

Pouzdana opcija
Da biste postigli ovaj cilj, možete pokušati onemogućiti direktivu ili napisati složeniji kod, na primjer, ovako: if (isset($_SESSION ['username'])) (echo “Hello” ($_SESSION ['username' ])”;) else (echo “Hello Guest”; echo “Welcome!”;). U ovom slučaju bit će teško napraviti zamjenu. Međutim, moguće je. Da biste to učinili, morate se unaprijed pobrinuti za dostupnost alata za brzi odgovor. Ako trebate uključiti globalne varijable u PHP, možete koristiti sljedeći alat: ako točno znate u kojem će rasponu vrijednost biti primljena, tada je možete napisati na način da skripta provjerava tu činjenicu usporedbom. To, naravno, također ne može jamčiti 100% zaštitu od zamjene vrijednosti. Međutim, prolazak kroz moguće opcije značajno će komplicirati operaciju.

Kako otkriti pokušaj prijevare?
Sada provjerimo jeste li dobro razumjeli sve prethodno napisano. Morat ćete sami deklarirati globalne varijable u funkciji. Ovo je svojevrsna domaća zadaća. Prvo, evo koda:

Dajmo neka objašnjenja. Varijabla C_COOKIE preuzeta je iz pouzdanog izvora. Kako bi se osiguralo da je rezultat očekivan, provjerava se vrijednost varijable. Ako dođe do problema, administrator dobiva obavijest. Ako se ništa ne dogodi, ništa se neće poduzeti.