Globalne spremenljivke v PHP. Obseg vidnosti spremenljivke PHP vidnost spremenljivke v funkcijah

Zadnja posodobitev: 1.11.2015

Pri uporabi spremenljivk in funkcij upoštevajte obseg spremenljivke. Obseg določa obseg delovanja in dostopnost dane spremenljivke.

Lokalne spremenljivke

Lokalne spremenljivke so ustvarjene znotraj funkcije. Do takšnih spremenljivk je mogoče dostopati samo znotraj določene funkcije. Na primer:

V tem primeru funkcija get() definira lokalno spremenljivko $result. In iz splošnega konteksta ne moremo dostopati do njega, to je, napišite $a = $result; To ni mogoče, ker je obseg spremenljivke $result omejen s funkcijo get(). Zunaj te funkcije spremenljivka $result ne obstaja.

Enako velja za parametre funkcije: zunaj funkcije tudi parametra $lowlimit in $highlimit ne obstajata.

Lokalne spremenljivke praviloma shranijo nekaj vmesnih rezultatov izračunov, kot v zgornjem primeru.

Statične spremenljivke

Statične spremenljivke so podobne lokalnim spremenljivkam. Razlikujejo se po tem, da se po zaključku funkcije njihova vrednost shrani. Ob vsakem klicu funkcije uporabi predhodno shranjeno vrednost. Na primer:

Za navedbo, da bo spremenljivka statična, se ji doda ključna beseda static. S tremi zaporednimi klici funkcije getCounter() bo spremenljivka $counter povečana za eno.

Če bi bila spremenljivka $counter običajna nestatična spremenljivka, potem bi getCounter() izpisal 1 ob vsakem klicu.

Običajno se statične spremenljivke uporabljajo za ustvarjanje različnih števcev, kot v zgornjem primeru.

Globalne spremenljivke

Včasih želite, da je spremenljivka na voljo povsod, globalno. Takšne spremenljivke lahko shranijo nekatere podatke, ki so skupni celotnemu programu. Če želite definirati globalne spremenljivke, uporabite globalno ključno besedo:1

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

Po klicu funkcije getGlobal() lahko do spremenljivke $gvar dostopate iz katerega koli dela programa.

Obseg spremenljivke je kontekst, v katerem je ta spremenljivka definirana. Večina spremenljivk PHP ima en sam obseg. Ta enotni obseg (imenovan tudi globalni obseg) zajema tudi vključene datoteke:

V tem primeru bo spremenljivka $a na voljo tudi znotraj vključenega skripta - main.inc.

Lokalne spremenljivke

Definicija funkcije po meri določa lokalni obseg za spremenljivko, tj. Vsaka spremenljivka, uporabljena znotraj funkcije, je privzeto omejena na lokalni obseg funkcije (na voljo samo znotraj funkcije, v kateri je definirana). Kako deluje: za ločevanje spremenljivk, uporabljenih v splošni kodi, od spremenljivk, uporabljenih v funkcijah, nudi PHP ločeno shranjevanje za spremenljivke znotraj vsake funkcije. Ta delitev prostora za shranjevanje pomeni, da je obseg, to je območje, v katerem je na voljo vrednost spremenljivke, lokalni pomnilnik funkcije.

Spodnji primer jasno prikazuje, da se spremenljivka, deklarirana zunaj funkcije, ne spremeni znotraj funkcije. Čeprav ne bi smeli poskušati razumeti, kako funkcija deluje, je glavna stvar ta, da ima svoj edinstven nabor spremenljivk:

30 ?>

Kot rezultat izvedbe tega fragmenta bo prikazano naslednje: 30.

Znotraj funkcije birth() je spremenljivka $age nastavljena na 1, vendar to ni ista spremenljivka, ki je bila definirana v globalnem obsegu. Ko je torej natisnjena vrednost spremenljivke $age, se natisne prvotna vrednost 30. Treba je omeniti, da se lokalne spremenljivke ustvarijo ob klicu funkcije in se izbrišejo, ko se funkcija konča.

Če dejansko želite prebrati ali spremeniti vrednost globalne spremenljivke (kot se imenujejo spremenljivke, ki se uporabljajo v globalnem obsegu) namesto lokalne znotraj funkcije birth(), jo morate v definiciji funkcije razglasiti za globalno.

Opomba: Aktivirana je prilagodljiva različica spletnega mesta, ki se samodejno prilagodi majhnosti vašega brskalnika in skrije nekatere podrobnosti spletnega mesta za lažje branje. Uživajte ob gledanju!

Pozdravljeni dragi bralci bloga Spletno mesto naprej! Ko smo izvedeli, da v PHP obstaja funkcija, smo se naučili, kako ustvariti lastne funkcije, jim posredovati argumente in jih poklicati za izvedbo. Če nadaljujemo s temo funkcij v PHP, je treba poudariti naslednje:

  • Znotraj funkcije lahko uporabite katero koli PHP kodo (cikle, pogoje, kakršne koli operacije), vključno z drugimi funkcijami (tako vgrajenimi kot po meri);
  • Ime funkcije se mora začeti z latinično črko ali podčrtajem, ki mu sledi poljubno število latiničnih črk, številk ali podčrtajev;
  • Vse funkcije imajo globalni obseg, kar pomeni, da je katero koli funkcijo mogoče poklicati kjer koli, tudi če je ta funkcija definirana znotraj druge;
  • PHP ne podpira preobremenitve funkcij, prav tako ni možnosti redefiniranja (spreminjanja, dodajanja) ali brisanja ustvarjene funkcije;
  • Funkcij ni treba definirati, preden jih uporabimo. To pomeni, da če najprej pokličete funkcijo in jo šele nato opišete v spodnji kodi, to ne bo vplivalo na delovanje in ne bo povzročilo napak.

Pogojne funkcije

Glede na stanje lahko ustvarimo (definiramo, opišemo) funkcijo. Na primer:

//poklicana funkcija sayHi, lahko jo pokličete kjer koli /*funkcije sayGoodbye tukaj ni mogoče poklicati, ker še nismo preverili pogoja in nismo šli v konstrukcijo if*/ if($apply)( function sayGoodbye())( echo "Adijo vsi!
"; } } /*zdaj lahko kličemo sayGoodbye*/
"; }

rezultat:

In poglejte ta primer:

/*in to se bo zgodilo, če tukaj pokličeš sayGoodbye*/ reci adijo(); if($apply)( function sayGoodbye())( echo "Adijo vsi!
"; ) ) funkcija sayHi())( echo "Pozdravljeni vsi!
"; }

rezultat:

Pravzaprav, kolikor delam, še nikjer nisem videl česa takega, vendar je treba imeti v mislih vse možnosti jezika.

Ugnezdene funkcije

Ugnezdena funkcija je funkcija, deklarirana znotraj druge funkcije. primer:

/*Tukaj ne morete poklicati sayGoodbye, ker se bo pojavil šele po klicu funkcije sayHi*/ reci Živjo(); /*pokliči funkcijo sayHi, lahko jo pokličeš kjerkoli*/ /*Zdaj lahko kličemo sayGoodbye*/ reci adijo(); funkcija sayHi())( echo "Pozdravljeni vsi!
"; funkcija sayGoodbye())( echo "Adijo vsi!
"; } }

Spet pri prvem prehodu se tolmač PHP označi, da je našel opis funkcije sayHi, vendar ne gre v njeno telo, vidi le ime, in ker tolmač ne gre v telo sayHi, potem nima pojma, kaj definiramo znotraj druge funkcije – sayGoodbye.

Nato se koda začne izvajati, pokličemo sayHi, tolmač PHP mora iti v telo funkcije sayHi, da jo izvede in tam pomotoma najde opis druge funkcije - sayGoodbye, po kateri lahko sayGoodbye pokličemo kjer koli, kolikorkrat kot želiš.

Vendar je vredno biti pozoren na zelo subtilno točko v zgornji situaciji: funkcija sayHi postane enkratna, ker če jo ponovno pokličemo, bo PHP spet naletel na definicijo funkcije sayGoodbye in v PHP ne morete to - funkcij ne morete preglasiti. O tem in kako se s tem spopasti sem pisal v prejšnjem članku.

V PHP se zgoraj opisane tehnike uporabljajo zelo redko, pogosteje jih je mogoče videti, na primer v JavaScriptu.

Obseg spremenljivke

V PHP sta natanko dva obsega: globalno in lokalni. Vsak programski jezik strukturira obsege drugače. Na primer, v C++ imajo sode zanke svoj (lokalni) obseg. Mimogrede, v PHP je to globalni obseg. Danes pa govorimo o funkcijah.

Funkcije v PHP imajo svoj notranji obseg (lokalni), kar pomeni, da so vse spremenljivke znotraj funkcije vidne samo znotraj te same funkcije.

Torej, še enkrat: vse zunaj funkcij je globalni obseg, vse znotraj funkcij je lokalni obseg. primer:

Spoštovani strokovnjaki, pozor, vprašanje! Kaj bo izpisalo zadnje navodilo? echo $name; ?

Kot ste sami videli, smo imeli 2 spremenljivki $name, ena znotraj funkcije (lokalni obseg), druga samo v kodi (globalni obseg), zadnja dodelitev spremenljivki $name je bil $name = "Rud Sergey"; A ker je bilo znotraj funkcije, je tam ostalo. V globalnem obsegu je bila zadnja dodelitev $name = "Andrej"; kar dejansko vidimo kot rezultat.

To sta dve enaki spremenljivki, ki pa se v različnih obsegih ne sekata in ne vplivata druga na drugo.

Naj ponazorim obseg na sliki:

Med prvim prehodom tolmač na kratko pregleda globalni obseg, si zapomni, katere spremenljivke in funkcije obstajajo, vendar ne izvede kode.

Dostop do globalnih spremenljivk iz lokalnega obsega

Kaj pa, če moramo še vedno dostopati do iste spremenljivke $name iz globalnega obsega iz funkcije in ne le dostopati do nje, ampak jo spremeniti? Za to obstajajo 3 glavne možnosti. Prvi je uporaba ključne besede globalno:

"; globalno ime $; /*odslej mislimo na globalno spremenljivko $name*/$name = "Rud Sergey"; ) $name = "Andrej"; pozdravi($ime); echo $name; // ?

rezultat:

Toda ta metoda ima pomanjkljivost, saj smo dostopali do globalne spremenljivke $name smo izgubili (prepisali) lokalno spremenljivko $name.

Drugi način je za uporabo PHP superglobalno polje. PHP sam samodejno postavi vsako spremenljivko, ki smo jo ustvarili v globalnem obsegu, v to matriko. primer:

$name = "Andrej"; //Enako kot$GLOBALS["name"] = "Andrej";

Zato:

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

Rezultat je enak kot pri uporabi ključne besede globalno:

Le da tokrat nismo prepisali lokalne spremenljivke, torej spremenljivke $name znotraj funkcije ostaja enaka in enaka "Andrej", vendar ne "Rud Sergej".

Posredovanje argumentov s sklicevanjem

Tretji način– to je prenos naslova ( povezave) spremenljivke, ne njene vrednosti. Povezave v PHP niso preveč uspešne, za razliko od drugih programskih jezikov. Vendar vam bom povedal edino pravilno možnost za posredovanje argumenta s sklicevanjem na funkcijo, ki je običajno podprta v PHP 5.3 in novejših. Obstajajo tudi drugi načini dela s povezavami, vendar so delovali v PHP 5.2 in nižjih, zato so se razvijalci PHP sami odločili, da jih opustijo, zato o njih ne bomo govorili.

Torej je PRAVILNO posredovanje argumenta s sklicevanjem v PHP 5.3 in novejših izvedeno na naslednji način:

Funkcija sayHi(& $name)(

V samem opisu funkcije smo dodali ikono ampersand (&) - ta ikona pomeni, da ne sprejemamo vrednosti spremenljivke, temveč povezavo (naslov) do te vrednosti v pomnilniku. Reference v PHP vam omogočajo, da ustvarite dve spremenljivki, ki kažeta na isto vrednost. To pomeni, da se ob spremembi ene od teh spremenljivk obe spremenita, saj se nanašata na isto vrednost v pomnilniku.

In na koncu imamo:

// ne sprejme vrednosti, ampak sklic na vrednost echo "Pozdravljeni, ".$name."!
"; $name = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); echo $name; // ?

rezultat:

Statične spremenljivke

Predstavljajte si naslednjo situacijo: prešteti moramo, kolikokrat smo se skupaj pozdravili. Tukaj poskušamo:

"; $c++; // povečaj števec za 1


rezultat:

Spremenljivka $c ne zapomni svojega pomena, ustvarja se vsakič znova. Narediti moramo svojo lokalno spremenljivko $c si zapomnijo njeno vrednost po izvedbi funkcije, za to uporabljajo ključno besedo statična:

// števec, narejen statičen echo "Pozdravljeni, ".$name."!
"; $c++; // povečaj števec za 1 echo "Pravkar sem pozdravil ". $c . " enkrat.


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

rezultat:

Vračanje vrednosti

Funkcije imajo tako priročno stvar, kot je vračanje vrednosti. To je, ko funkcija, namesto da bi nekaj natisnila na zaslon, vse postavi v spremenljivko in to spremenljivko da nam. In že se odločamo, kaj bomo s tem. Na primer, vzemimo to funkcijo, kvadrira število:

rezultat:

Naredimo tako, da namesto prikaza na zaslonu vrne rezultat izvedbe. Če želite to narediti, uporabite ključno besedo return:

rezultat:

Zdaj lahko to uporabimo na različne načine:

//izpiše rezultat odmev "
"; $num = getSquare(5); echo $num;

rezultat:

Upoštevajte, da ključna beseda vrnitev ne samo vrne vrednosti, ampak popolnoma prekine funkcijo, torej vso kodo, ki je pod ključno besedo vrnitev ne bo nikoli izpolnjeno. Z drugimi besedami, vrnitev za funkcije prav tako deluje kot odmor za zanke:

echo "PHP me ne bo nikoli dosegel:(";) echo getSquare(5); //izpiše rezultat odmev "
"; $num = getSquare(5); // dodelil rezultat spremenljivki echo $num; // prikaži spremenljivko na zaslonu

rezultat:

To je vrnitev– to je tudi izstop iz funkcije. Uporablja se lahko brez povratne vrednosti, samo zaradi izpisa.

Rekurzivna funkcija

Rekurzivna funkcija je funkcija, ki kliče samo sebe. Rekurzija se ne uporablja pogosto in velja za operacijo, ki zahteva veliko virov (počasno). Vendar se zgodi, da je uporaba rekurzije najbolj očitna in preprosta možnost. primer:

"; if($število< 20){ // tako da rekurzija ne postane neskončnaštetje Prosim(++$število); // funkcija countPlease je poklicala sama sebe) ) preštej Prosim(1);

rezultat:

Če veste, kako narediti brez rekurzije, potem je bolje, da to storite.

Močno tipkanje v PHP (izboljšanje tipa)

PHP naredi majhne korake proti močnemu tipkanju, tako da lahko vnaprej določimo, kakšen tip naj ima funkcija (to se imenuje tip-namig):

rezultat:

Ulovljiva usodna napaka: Argument 1, posredovan funkciji countPlease(), mora biti matrika, podano celo število, poklicano v /home/index.php v 7. vrstici in definirano v /home/index.php v 3. vrstici

Napaka nam pove, da funkcija pričakuje, da bo prejela matriko, vendar ji namesto tega posredujemo število. Žal lahko zaenkrat določimo samo tip za (matriko), s PHP 5.4 pa smo dodali tudi možnost kot klicati:

Kličljivo preveri, ali je mogoče posredovano vrednost poklicati kot funkcijo. Callable je lahko ime funkcije, podane s spremenljivko niza, ali objekt in ime klicane metode. Vendar bomo kasneje govorili o objektih in metodah (to je del objektno orientiranega programiranja), vendar ste že seznanjeni s funkcijami. Rezultata dela vam ne morem pokazati, ker trenutno imam PHP 5.3, vendar bi bil:

Imenuje se funkcija getEcho

Uporaba argumentov spremenljive dolžine

In končno, še en zelo redko uporabljen odtenek. Predstavljajte si situacijo: funkciji posredujemo argumente, čeprav jih v funkciji nismo opisali, na primer:

rezultat:

Kot lahko vidite, ni nobenih napak, vendar naši posredovani argumenti niso nikjer uporabljeni. Vendar to ne pomeni, da jih ni več - še vedno so bili posredovani v funkcijo in jih lahko uporabljamo; za to obstajajo vgrajene funkcije PHP:

func_num_args()- Vrne število argumentov, posredovanih funkciji
func_get_arg(zaporedna številka)- Vrne element s seznama argumentov
func_get_args()- Vrne matriko, ki vsebuje argumente funkcije

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

rezultat:

Zaključek

Današnji članek je zadnji na temo funkcij v PHP. Zdaj ste lahko prepričani v popolnost svojega znanja o tej temi in lahko samozavestno uporabljate funkcije za svoje potrebe.

Če ima nekdo željo, da bi se izboljšal, pa nima pojma, kako bi to naredil, bi bil najboljši način, da napiše že pripravljene (vgrajene) PHP funkcije, lahko na primer napišete svojo lastno funkcijo count(). ali katero koli drugo.

Hvala vsem za pozornost in se vidimo spet! Če kaj ni jasno, lahko postavite svoja vprašanja v komentarjih!

Obseg spremenljivke je kontekst, v katerem je spremenljivka definirana. V večini primerov imajo vse spremenljivke PHP samo en obseg. Ta enotni obseg zajema tudi vključene in zahtevane datoteke. Na primer:

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

Tukaj bo spremenljivka $a na voljo znotraj vključenega skripta b.inc. Vendar pa definicija (telo) uporabniško definirane funkcije določa lokalni obseg te funkcije. Vsaka spremenljivka, uporabljena znotraj funkcije, je privzeto omejena na lokalni obseg funkcije. Na primer:

$a = 1; /* globalni obseg */

Funkcijski test()
{
echo $a ; /* sklic na spremenljivko lokalnega obsega */
}

Test();
?>

Ta skript ne bo ustvaril nobenega rezultata, ker stavek echo kaže na lokalno različico spremenljivke $a in ji ni bila dodeljena vrednost v tem obsegu. Morda ste opazili, da se to nekoliko razlikuje od C, saj so globalne spremenljivke v C samodejno na voljo funkcijam, razen če so bile prepisane z lokalno definicijo. To lahko povzroči nekaj težav, saj lahko ljudje pomotoma spremenijo globalno spremenljivko. V PHP, če naj se globalna spremenljivka uporablja znotraj funkcije, mora biti deklarirana kot globalna znotraj definicije funkcije.

Ključna beseda globalno

Najprej primer uporabe globalno:

Primer #1 uporabe globalno

$a = 1;
$b = 2;

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

$b = $a + $b ;
}

Vsota();
echo $b ;
?>

Prikazal se bo zgornji skript 3 . Ko sta $a in $b definirana kot globalna znotraj funkcije, bodo vse reference na katero koli od teh spremenljivk kazale na njihovo globalno različico. Število globalnih spremenljivk, ki jih lahko obravnava funkcija, ni omejeno.

Drugi način za dostop do spremenljivk globalnega obsega je uporaba posebne matrike, definirane v PHP, $GLOBALS. Prejšnji primer bi lahko prepisali takole:

$GLOBALS je asociativno polje, katerega ključ je ime, vrednost pa vsebina globalne spremenljivke. Upoštevajte, da $GLOBALS obstaja v katerem koli obsegu, to je zato, ker je $GLOBALS superglobalen. Spodaj je primer, ki prikazuje zmogljivosti superglobalov:

Primer #3 Superglobali in obseg

funkcija test_global()
{
// Večina vnaprej določenih spremenljivk ni
// "super" in da je na voljo v lokalnem okolju
// vidnost, funkcije zahtevajo podatek "global".
globalni $HTTP_POST_VARS;

Echo $HTTP_POST_VARS["ime"];

// Superglobali so na voljo v katerem koli obsegu
// vidnost in ne zahteva navedbe "global".
// Superglobali so na voljo od PHP 4.1.0 in
// uporaba HTTP_POST_VARS je zastarela.
echo $_POST ["ime"];
}
?>

Komentiraj:

Uporaba ključnih besed globalno zunaj funkcije ni napaka. Uporablja se lahko v datoteki, ki je vključena v funkcijo.

Uporaba statičnega ( statična) spremenljivke

Druga pomembna lastnost spremenljivega obsega je statična spremenljivka. Statična spremenljivka obstaja le v lokalnem obsegu funkcije, vendar ne izgubi svoje vrednosti, ko izvajanje programa zapusti to območje. Razmislite o naslednjem primeru:

Primer #4 Dokazovanje potrebe po statičnih spremenljivkah

preizkus funkcije ()
{
$a = 0;
echo $a ;
$a++;
}
?>

Ta funkcija je precej neuporabna, ker vsakič, ko jo pokličete, nastavi $a na 0 in izhodi 0 . Povečanje spremenljivke $a ++ tukaj ne igra vloge, saj spremenljivka $a izgine, ko funkcija zapre. Če želite napisati uporabno funkcijo štetja, ki ne izgubi trenutne vrednosti števca, je spremenljivka $a deklarirana kot statična:

Primer #5 Primer uporabe statičnih spremenljivk

preizkus funkcije ()
{
statični $a = 0;
echo $a ;
$a++;
}
?>

Zdaj bo $a inicializiran samo ob prvem klicu funkcije in ob vsakem klicu funkcije test() bo natisnil vrednost $a in jo povečal.

Statične spremenljivke omogočajo tudi delo z rekurzivnimi funkcijami. Rekurzivna funkcija je tista, ki kliče samo sebe. Pri pisanju rekurzivne funkcije morate biti previdni, saj obstaja možnost, da postane rekurzija neskončna. Zagotoviti morate, da obstaja ustrezen način za prekinitev rekurzije. Naslednja preprosta funkcija šteje do 10 rekurzivno, pri čemer uporablja statično spremenljivko $count, da določi, kdaj naj se ustavi:

Komentiraj:

Statične spremenljivke je mogoče deklarirati, kot je prikazano v prejšnjem primeru. Poskus dodelitve vrednosti tem spremenljivkam, ki so rezultat izrazov, bo povzročil napako pri obdelavi.

Primer #7 Deklaracija statičnih spremenljivk

funkcija foo ()(
statični $int = 0; // prav
statični $int = 1 + 2; // nepravilno (ker gre za izraz)
statični $int = sqrt(121); // nepravilno (ker je tudi to izraz)

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

Komentiraj:

Statične deklaracije se ovrednotijo ​​med prevajanjem skripta.

Povezave z globalno ( globalno) in statični ( statična) spremenljivke

Zend Engine 1, ki poganja PHP 4, obravnava modifikatorje statičnih in globalnih spremenljivk kot reference. Na primer, prava globalna spremenljivka, vdelana v obseg funkcije z določitvijo ključne besede globalno, dejansko ustvari sklic na globalno spremenljivko. To lahko povzroči nepričakovano vedenje, kot je prikazano v naslednjem primeru:

funkcija test_global_ref() (
globalni $obj ;
$obj = &nov stdclass ;
}

funkcija test_global_noref() (
globalni $obj ;
$obj = nov razred std;
}

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

Rezultat izvajanja tega primera: get_instance_noref () (
statični $obj;

Echo "Statični predmet: ";
var_dump($obj);
če (!isset($obj )) (
// Dodeli objekt statični spremenljivki
$obj = nov razred std;
}
$obj -> lastnost++;
vrni $obj;
}

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

Rezultat izvajanja tega primera:

Statični objekt: NULL
Statični objekt: NULL

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

Ta primer prikazuje, da ko dodelite sklic na statično spremenljivko, tega ni nepozabno ko pokličete funkcijo &get_instance_ref() drugič.

Če želite ustvariti popolno spletno mesto s širokim naborom funkcij, morate vedeti veliko. Vendar pa lahko PHP daje spletnemu mestu resnično edinstvenost. Globalna spremenljivka se v tem programskem jeziku ne uporablja pogosto, vendar je včasih zelo koristno vedeti, kako deluje.


V tem članku bomo natančno preučili, kaj je globalna spremenljivka in kako deluje.

Globalna spremenljivka: obseg

Kontekst, znotraj katerega je definirana spremenljivka, se imenuje njen obseg. Običajno imajo spremenljivke samo en obseg. Ko so globalne spremenljivke v PHP naložene iz drugih datotek, so lahko zahtevane ali vključene. Privzeto so omejeni na lokalni obseg funkcije. Kako lahko naredite spremenljivko vidno datotekam zunaj njenih meja in jo lahko tudi uporabljate? Ravno zato PHP ponuja globalno spremenljivko. Ključna beseda tukaj je "globalno". Kako deklarirati globalno spremenljivko v PHP? Za dosego tega cilja je treba uporabiti besedo "globalno". Postaviti ga je treba neposredno pred spremenljivko, ki jo želite narediti globalno. Videti je nekako takole: globalna "Spremenljivka". Po izvajanju tovrstnih navodil bo popolnoma vsaka datoteka lahko delala s podatki.

Če so nekje sklicevanja na to spremenljivko, bo program pozoren na globalno različico. Zakaj se uporablja tako čudno besedilo? Stvar je v tem, da hkrati lahko obstajajo tudi lokalne različice. Bodo pa bolj dostopni izključno v datotekah, v katerih so prijavljeni. Za ostalo bodo veljale globalne spremenljivke razreda PHP. Tukaj morate ravnati zelo previdno in previdno. Da preprečimo dvome, navedimo preprost primer, kako bi lahko izgledali: globalni a. Če ima ena datoteka dostop do več spremenljivk, lahko to povzroči konflikt. Vendar tukaj ni mogoče zagotovo reči, ali bo prebrana globalna ali lokalna spremenljivka ali pa bo prišlo do napake. Če ga napišete znotraj funkcije, ne bi smelo biti težav. Uporaba spremenljivke zunaj meja funkcije bo problematična. Zato morate zelo natančno spremljati strukturo kode in se prepričati, da nikjer ni predpogojev za konflikt.

Globalne spremenljivke: še en zapis
Ali obstajajo drugi načini za nastavitev globalnih spremenljivk? Da, in ne sam. Poglejmo najprej $GLOBALS. Je asociativno polje, v katerem je ključ ime. Kot vrednost se uporabi vsebina globalne spremenljivke. Omeniti velja, da po deklaraciji ta niz obstaja v katerem koli obsegu. To daje razloge, da jo štejemo za superglobalno. Videti je takole: $GLOBALS ['Spremenljivka'].

Superglobali
V katerem koli programskem jeziku obstajajo imena, ki so rezervirana za posamezne funkcije. V PHP preprosto ni mogoče ustvariti globalnih spremenljivk z istim imenom. Ta programski jezik ima svoje značilnosti. Na primer, posebej pomembno je, da vnaprej določene spremenljivke nimajo predpone »super«. To pomeni, da niso na voljo na vseh lokacijah. Kako se lahko to stanje popravi? Če želite narediti vnaprej določeno spremenljivko na voljo v lokalnem omrežju, jo morate deklarirati takole: globalna "spremenljivka". To je bilo že prej omenjeno. Vendar to ne drži povsem. Poglejmo pravi primer:
Globalni $HTTP_POST_VARS; echo $HTTP_POST_VARS ['ime'].
Ali čutite razliko? Upoštevati je treba, da je treba v PHP znotraj funkcije uporabiti globalno spremenljivko. Lahko se nahaja tudi v datoteki, ki je vključena vanjo.

Varnost in povezave
Kot lahko vidite sami, ustvarjanje globalne spremenljivke v PHP ni problem. Toda ali obstajajo kakšne posebnosti glede povezav? Pri uporabi globalnih spremenljivk je možno nekaj nepričakovanega vedenja. Toda preden podrobneje preučimo to vprašanje, se je treba obrniti v ozadje. Direktiva register_globals je bila spremenjena iz omogočene v privzeto onemogočeno v različici 4.2. Za mnoge uporabnike je to popolnoma nepomembno in zaman, saj je varnost izdelka, ki se razvija, neposredno odvisna od tega. Če morate ustvariti globalno spremenljivko, potem direktiva PHP ne bo neposredno vplivala na to nastavitev. Vendar lahko nepravilna uporaba postane varnostno tveganje. Torej, na primer, če je register_globals v omogočenem stanju, bodo različne potrebne spremenljivke inicializirane, preden se izvede koda. Zato so se odločili, da ga izklopijo. Zakaj globalna spremenljivka velik del svojega stanja dolguje dani direktivi? Težava je v tem, da ko je bila omogočena, razvijalci niso znali vedno odgovoriti na vprašanje, od kod prihaja, po drugi strani pa je to zelo olajšalo proces pisanja kode. Hkrati je takšna organizacija ustvarila določeno grožnjo varnosti. Da bi se izognili mešanju podatkov in napakam, je bila direktiva onemogočena. Zdaj pa si poglejmo primer nevarne kode. Preučili bomo tudi, kako lahko zaznate primere, ko deklaracijo globalne spremenljivke PHP spremlja poskus zamenjave informacij. To je potrebno za ustvarjanje stabilnih delujočih spletnih mest, ki jih ne more vdreti prvi uporabnik, ki jih naleti.

Nevarne kode
Nastavimo spremenljivko na true za tiste uporabnike, ki so pooblaščeni:
If (authenticate_user()) ($authoriza=true;) if ($authorize) ( vključi “/highly/sensitive/data.php”;). Spremenljivko v tem stanju je mogoče nastaviti samodejno. Glede na to, da je podatke mogoče preprosto zamenjati, izvor njihovega izvora pa ni ugotovljen, lahko tako preverjanje opravi tako rekoč vsak uporabnik in se izda za kogar koli. Napadalec lahko po želji zmoti logiko celotnega skripta. Če spremenite vrednost direktive, bo koda delovala pravilno. Točno to moramo storiti. Vendar pa inicializacija spremenljivk ni samo dobra praksa med programerji, temveč zagotavlja tudi stabilnost skripta.

Zanesljiva možnost
Če želite doseči ta cilj, lahko poskusite onemogočiti direktivo ali napisati bolj zapleteno kodo, na primer tako: if (isset($_SESSION ['uporabniško ime'])) (echo “Hello” ($_SESSION ['uporabniško ime' ])«;) else (echo »Pozdravljeni gost«; echo »Dobrodošli!«;). V tem primeru bo težko narediti zamenjavo. Vendar je možno. Če želite to narediti, morate vnaprej poskrbeti za razpoložljivost orodij za hitro odzivanje. Če morate v PHP vključiti globalne spremenljivke, lahko uporabite naslednje orodje: če natančno veste, v katerem obsegu bo prejeta vrednost, jo lahko zapišete tako, da skript to dejstvo preveri s primerjavo. To seveda tudi ne more zagotoviti 100-odstotne zaščite pred zamenjavo vrednosti. Vendar pa bo pregledovanje možnih možnosti znatno zapletlo operacijo.

Kako odkriti poskus ponarejanja?
Zdaj pa preverimo, ali ste vse prej napisano pravilno razumeli. Sami boste morali deklarirati globalne spremenljivke v funkciji. To je neke vrste domača naloga. Najprej je tukaj koda:

Dajmo nekaj pojasnil. Spremenljivka C_COOKIE je vzeta iz zanesljivega vira. Za zagotovitev, da je njegov rezultat pričakovan, se preveri vrednost spremenljivke. Če pride do težav, administrator prejme obvestilo. Če se nič ne zgodi, ne bomo ukrepali.