Globale variabler i PHP. Php variabel synlighet omfang variabel synlighet i funksjoner

Sist oppdatert: 1.11.2015

Når du bruker variabler og funksjoner, bør du vurdere variabelt omfang. Omfanget spesifiserer handlingsrom og tilgjengelighet for en gitt variabel.

Lokale variabler

Lokale variabler opprettes inne i en funksjon. Slike variabler kan bare nås fra en gitt funksjon. For eksempel:

I dette tilfellet definerer get()-funksjonen en lokal variabel $result . Og fra den generelle konteksten kan vi ikke få tilgang til det, det vil si å skrive $a = $result; Dette er ikke mulig fordi omfanget av $result-variabelen er begrenset av get()-funksjonen. Utenfor denne funksjonen eksisterer ikke $result-variabelen.

Det samme gjelder funksjonsparametere: utenfor funksjonen eksisterer heller ikke parameterne $lowlimit og $highlimit.

Som regel lagrer lokale variabler noen mellomresultater av beregninger, som i eksemplet ovenfor.

Statiske variabler

Statiske variabler ligner på lokale variabler. De er forskjellige ved at etter at funksjonen er fullført, lagres verdien deres. Hver gang funksjonen kalles opp, bruker den den tidligere lagrede verdien. For eksempel:

For å indikere at en variabel vil være statisk, legges nøkkelordet statisk til den. Med tre påfølgende kall til getCounter(), vil $counter-variabelen økes med én.

Hvis $counter-variabelen var en vanlig ikke-statisk variabel, ville getCounter() skrevet ut 1 hver gang den ble kalt.

Vanligvis brukes statiske variabler til å lage ulike tellere, som i eksemplet ovenfor.

Globale variabler

Noen ganger vil du at en variabel skal være tilgjengelig overalt, globalt. Slike variabler kan lagre noen data som er felles for hele programmet. For å definere globale variabler, bruk det globale nøkkelordet:1

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

Etter å ha kalt getGlobal()-funksjonen, kan $gvar-variabelen nås fra hvilken som helst del av programmet.

Variabelt omfang er konteksten som variabelen er definert i. De fleste PHP-variabler har et enkelt omfang. Dette enkeltomfanget (også kalt det globale omfanget) dekker også inkluderte filer:

I dette eksemplet vil $a-variabelen også være tilgjengelig i det inkluderte skriptet - main.inc .

Lokale variabler

En egendefinert funksjonsdefinisjon spesifiserer lokalt omfang for en variabel, dvs. Enhver variabel som brukes i en funksjon er som standard begrenset til det lokale omfanget av funksjonen (bare tilgjengelig innenfor funksjonen der den er definert). Slik fungerer det: For å skille variabler som brukes i generell kode fra variabler som brukes i funksjoner, gir PHP separat lagring for variabler innenfor hver funksjon. Denne inndelingen av lagringsplass innebærer at omfanget, det vil si området der verdien av en variabel er tilgjengelig, er funksjonens lokale lagring.

Eksemplet nedenfor viser tydelig at en variabel deklarert utenfor en funksjon ikke endres inne i funksjonen. Selv om du ikke bør prøve å forstå hvordan funksjonen fungerer, er hovedsaken at den har sitt eget unike sett med variabler:

30 ?>

Som et resultat av å kjøre dette fragmentet, vil følgende vises: 30.

Inne i birth()-funksjonen er variabelen $age satt til 1, men dette er ikke den samme variabelen som ble definert i det globale omfanget. Derfor, når verdien til $age-variabelen skrives ut, skrives den opprinnelige verdien på 30. Det er verdt å merke seg at lokale variabler opprettes på det tidspunktet funksjonen kalles og slettes etter at funksjonen er ferdig.

Hvis du faktisk ønsker å lese eller endre verdien av en global variabel (som variabler som brukes i det globale omfanget kalles) i stedet for en lokal i birth()-funksjonen, må den erklæres global innenfor funksjonsdefinisjonen.

Notatet: Den adaptive versjonen av nettstedet er aktivert, som automatisk tilpasser seg den lille størrelsen på nettleseren din og skjuler noen detaljer om nettstedet for enkel lesing. Nyt å se!

Hei kjære blogglesere Nettstedet på! I lærte vi at det er en funksjon i PHP, vi lærte hvordan vi lager våre egne funksjoner, sender argumenter til dem og kaller dem for kjøring. Fortsetter temaet funksjoner i PHP, er det nødvendig å understreke følgende ting:

  • Inne i funksjonen kan du bruke hvilken som helst PHP-kode (sykluser, betingelser, alle operasjoner), inkludert andre funksjoner (både innebygd og tilpasset);
  • Funksjonsnavnet må begynne med en latinsk bokstav eller et understrek, etterfulgt av et hvilket som helst antall latinske bokstaver, tall eller understreking;
  • Alle funksjoner har globalt omfang, noe som betyr at enhver funksjon kan kalles hvor som helst, selv om den funksjonen er definert i en annen;
  • PHP støtter ikke funksjonsoverbelastning, det er heller ingen mulighet for å redefinere (endre, legge til) eller slette en opprettet funksjon;
  • Funksjoner må ikke defineres før de tas i bruk. Det vil si at hvis du først kaller en funksjon, og først deretter beskriver den i koden nedenfor, vil dette ikke påvirke ytelsen og ikke forårsake feil.

Betingede funksjoner

Vi kan lage (definere, beskrive) en funksjon avhengig av betingelsen. For eksempel:

//kalt funksjonen si hei, den kan kalles hvor som helst /*sayGoodbye-funksjonen kan ikke kalles her, siden vi ennå ikke har sjekket tilstanden og ikke har gått inn i if-konstruksjonen*/ if($apply)( function sayGoodbye())( ekko "Hei alle sammen!
"; } } /*nå kan vi ringe si farvel*/
"; }

Resultat:

Og ta en titt på dette eksemplet:

/*og dette er hva som vil skje hvis du ringer si farvel her*/ si farvel(); if($apply)( function sayGoodbye())( ekko "Hei alle sammen!
"; ) ) function sayHi())( echo "Hei alle sammen!
"; }

Resultat:

Faktisk, så mye som jeg har jobbet, har jeg aldri sett noe lignende noe sted, men du må huske på alle språkets muligheter.

Nestede funksjoner

En nestet funksjon er en funksjon som er deklarert inne i en annen funksjon. Eksempel:

/*Du kan ikke ringe sayGoodbye her, siden den vises først etter at du har ringt sayHi-funksjonen*/ si hei(); /*kall funksjonen si hei, den kan kalles hvor som helst*/ /*Nå kan vi ringe si farvel*/ si farvel(); function sayHi())( ekko "Hei alle sammen!
"; function sayGoodbye())( echo "Hei alle sammen!
"; } }

Igjen, på den første traverseringen, markerer PHP-tolken seg selv at den har funnet en beskrivelse av sayHi-funksjonen, men går ikke inn i kroppen sin, den ser bare navnet, og siden tolken ikke går inn i kroppen til sayHi, da har den ingen anelse om hva vi definerer i en annen funksjon – si farvel.

Så begynner koden å kjøre, vi kaller sayHi, PHP-tolkeren må gå inn i kroppen til sayHi-funksjonen for å utføre den og der finner den ved et uhell beskrivelsen av en annen funksjon - sayGoodbye, hvoretter sayGoodbye kan kalles hvor som helst, like mange ganger som du liker.

Men det er verdt å ta hensyn til et veldig subtilt punkt i situasjonen ovenfor: sayHi-funksjonen blir engangs, for hvis vi kaller den igjen, vil PHP igjen komme over definisjonen av sayGoodbye-funksjonen, og i PHP kan du ikke gjøre det. dette - du kan ikke overstyre funksjoner. Jeg skrev om dette og hvordan jeg skal håndtere det i en tidligere artikkel.

I PHP brukes teknikkene beskrevet ovenfor svært sjelden, de kan sees oftere, for eksempel i JavaScript.

Variabelt omfang

Det er nøyaktig to omfang i PHP: global Og lokale. Hvert programmeringsspråk strukturerer forskjellig omfang. For eksempel, i C++, har selvløkker sitt eget (lokale) omfang. I PHP er dette forresten et globalt omfang. Men i dag snakker vi om funksjoner.

Funksjoner i PHP har sitt eget interne omfang (lokalt), det vil si at alle variabler inne i en funksjon er kun synlige innenfor denne funksjonen.

Så, nok en gang: alt utenfor funksjonene er det globale omfanget, alt innenfor funksjonene er det lokale omfanget. Eksempel:

Kjære eksperter, oppmerksomhet, spørsmål! Hva vil den siste instruksjonen gi? ekko $navn; ?

Som du så selv, hadde vi 2 variabler $navn, en innenfor funksjonen (lokalt omfang), den andre bare i koden (globalt omfang), den siste tilordningen til en variabel $navn var $name = "Rud Sergey"; Men siden den var inne i funksjonen ble den der. I det globale omfanget var det siste oppdraget $name = "Andrey"; som er det vi faktisk ser som et resultat.

Det vil si to identiske variabler, men i ulike omfang skjærer de seg ikke og påvirker ikke hverandre.

La meg illustrere omfanget i figuren:

Under den første traverseringen skanner tolken kort det globale omfanget, husker hvilke variabler og funksjoner som finnes, men utfører ikke koden.

Tilgang til globale variabler fra lokalt omfang

Men hva om vi fortsatt trenger å få tilgang til den samme $name-variabelen fra det globale omfanget fra en funksjon, og ikke bare få tilgang til den, men endre den? Det er 3 hovedalternativer for dette. Den første bruker et nøkkelord global:

"; global $navn; /*fra nå av mener vi den globale variabelen $name*/$name = "Rud Sergey"; ) $name = "Andrey"; si hei($navn); ekko $navn; // ?

Resultat:

Men denne metoden har en ulempe, siden vi fikk tilgang til den globale variabelen $navn vi mistet (overskrev) en lokal variabel $navn.

Andre vei er å bruke PHP superglobal matrise. PHP selv plasserer automatisk hver variabel som vi opprettet i det globale omfanget i denne matrisen. Eksempel:

$name = "Andrey"; //Samme som$GLOBALS["name"] = "Andrey";

Derfor:

"; $GLOBALS["name"] = "Rud Sergey"; ) $name = "Andrey"; si hei($navn); ekko $navn; // ?

Resultatet er det samme som å bruke nøkkelordet global:

Bare denne gangen skrev vi ikke om den lokale variabelen, det vil si variabelen $navn inne i funksjonen forblir den samme og er lik "Andrey", men ikke "Rud Sergey".

Sende argumenter ved referanse

Tredje vei– dette er overføringen av adresse ( lenker) av en variabel, ikke dens verdi. Lenker i PHP er ikke særlig vellykkede, i motsetning til andre programmeringsspråk. Jeg vil imidlertid fortelle deg det eneste riktige alternativet for å sende et argument ved å referere til en funksjon, som vanligvis støttes i PHP 5.3 og nyere. Det er andre måter å jobbe med lenker på, men de fungerte i PHP 5.2 og lavere, som et resultat bestemte PHP-utviklerne selv å forlate dem, så vi vil ikke snakke om dem.

Så, RIKTIG overføring av et argument ved referanse i PHP 5.3 og høyere gjøres som følger:

Funksjon si hei(& $navn)(

I selve funksjonsbeskrivelsen la vi til et og-tegnet (&)-ikon - dette ikonet betyr at vi ikke aksepterer verdien til variabelen, men en lenke (adresse) til denne verdien i minnet. Referanser i PHP lar deg lage to variabler som peker på samme verdi. Dette betyr at når en av disse variablene endres, endres begge, siden de refererer til samme verdi i minnet.

Og til slutt har vi:

//aksepter ikke en verdi, men en referanse til verdien echo "Hei, ".$navn."!
"; $name = "Rud Sergey"; ) $name = "Andrey"; si hei($navn); ekko $navn; // ?

Resultat:

Statiske variabler

Tenk deg følgende situasjon: vi må telle hvor mange ganger vi sa hei totalt. Her er hva vi prøver å gjøre:

"; $c++; // øke telleren med 1


Resultat:

Variabel $c husker ikke betydningen, den skapes på nytt hver gang. Vi må lage vår lokale variabel $c husket verdien etter å ha utført funksjonen, for dette bruker de et nøkkelord statisk:

// teller, gjort statisk echo "Hei, ".$navn."!
"; $c++; // øke telleren med 1 ekko "Bare sa hei". $c . " en gang.


"; ) si hei("Rud Sergey"); si hei("Andrey"); si hei("Dmitry");

Resultat:

Returverdier

Funksjoner har en så praktisk ting som å returnere verdier. Dette er når en funksjon, i stedet for å skrive ut noe på skjermen, legger alt inn i en variabel og gir den variabelen til oss. Og vi bestemmer oss allerede for hva vi skal gjøre med det. La oss for eksempel ta denne funksjonen, den kvadrerer et tall:

Resultat:

La oss gjøre det slik at i stedet for å vise det på skjermen, returnerer det utførelsesresultatet. For å gjøre dette, bruk returnøkkelordet:

Resultat:

Nå kan vi bruke dette på forskjellige måter:

//mater ut resultatet ekko "
"; $num = getSquare(5); ekko $num;

Resultat:

Vær oppmerksom på at nøkkelordet komme tilbake returnerer ikke bare en verdi, men avbryter funksjonen fullstendig, det vil si all koden som er under nøkkelordet komme tilbake vil aldri bli oppfylt. Med andre ord, retur for funksjoner fungerer også som gå i stykker for løkker:

echo "PHP vil aldri nå meg:(";) echo getSquare(5); //mater ut resultatet ekko "
"; $num = getSquare(5); // tildelte resultatet til en variabel ekko $num; // vis variabelen på skjermen

Resultat:

Det er komme tilbake– dette er også en utgang fra funksjonen. Den kan brukes uten returverdi, bare for utdataens skyld.

Rekursiv funksjon

En rekursiv funksjon er en funksjon som kaller seg selv. Rekursjon brukes ikke ofte og regnes som en ressurskrevende (langsom) operasjon. Men det hender at bruk av rekursjon er det mest åpenbare og enkle alternativet. Eksempel:

"; if($nummer< 20){ // slik at rekursjonen ikke blir uendelig countPlease(++$nummer); // countPlease-funksjonen kalte seg selv) ) tellVennligst(1);

Resultat:

Hvis du vet hvordan du gjør det uten rekursjon, er det bedre å gjøre det.

Sterk skriving i PHP (typeavgrensning)

PHP tar små skritt mot sterk skriving, så vi kan spesifisere på forhånd hvilken type en funksjon skal ta (dette kalles type-hint):

Resultat:

Fangbar fatal feil: Argument 1 sendt til countPlease() må være en matrise, heltall gitt, kalt inn /home/index.php på linje 7 og definert i /home/index.php på linje 3

Feilen forteller oss at funksjonen forventer å motta en matrise, men i stedet sender vi den et tall. Dessverre kan vi foreløpig bare spesifisere typen for (array), og med PHP 5.4 la vi også til et alternativ som anropsbar:

Ringbar sjekker om den beståtte verdien kan kalles opp som en funksjon. Callable kan enten være navnet på en funksjon spesifisert av en strengvariabel, eller et objekt og navnet på metoden som kalles. Men vi vil snakke om objekter og metoder senere (dette er en del av objektorientert programmering), men du er allerede kjent med funksjoner. Jeg kan ikke vise deg resultatet av arbeidet, siden jeg for øyeblikket har PHP 5.3, men det vil være:

Kalt getEcho-funksjonen

Bruke argumenter med variabel lengde

Og til slutt, enda en svært sjelden brukt nyanse. Tenk deg en situasjon: vi sender argumenter til en funksjon, selv om vi ikke beskrev dem i funksjonen, for eksempel:

Resultat:

Som du kan se er det ingen feil, men våre beståtte argumenter brukes ikke noe sted. Men dette betyr ikke at de er borte - de ble fortsatt sendt inn i funksjonen og vi kan bruke dem; det er innebygde PHP-funksjoner for dette:

func_num_args()- Returnerer antall argumenter som er sendt til funksjonen
func_get_arg(sekvensnummer)- Returnerer et element fra en liste med argumenter
func_get_args()- Returnerer en matrise som inneholder funksjonsargumentene

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

Resultat:

Konklusjon

Dagens artikkel er den siste om temaet funksjoner i PHP. Nå kan du være trygg på at kunnskapen din om dette emnet er fullstendig, og du kan trygt bruke funksjonene etter dine behov.

Hvis noen har et ønske om å bli bedre på det, men ikke aner hvordan det skal gjøres, vil den beste måten være å skrive ferdige (innebygde) PHP-funksjoner, for eksempel kan du skrive din egen count()-funksjon eller noe annet.

Takk alle sammen for oppmerksomheten og på gjensyn! Hvis noe ikke er klart, still gjerne spørsmålene dine i kommentarfeltet!

Omfanget til en variabel er konteksten som variabelen er definert i. I de fleste tilfeller har alle PHP-variabler bare ett omfang. Dette enkeltomfanget dekker også inkluderte og nødvendige filer. For eksempel:

$a = 1 ;
inkludere "b.inc" ;
?>

Her vil $a-variabelen være tilgjengelig i det inkluderte b.inc-skriptet. Definisjonen (kroppen) av en brukerdefinert funksjon spesifiserer imidlertid det lokale omfanget av denne funksjonen. Enhver variabel som brukes i en funksjon er som standard begrenset til funksjonens lokale omfang. For eksempel:

$a = 1 ; /* globalt omfang */

Funksjonstest()
{
ekko $a ; /* referanse til lokal omfangsvariabel */
}

Test();
?>

Dette skriptet vil ikke generere noe utdata fordi ekkosetningen peker til en lokal versjon av variabelen $a og den har ikke blitt tildelt en verdi innenfor dette omfanget. Du har kanskje lagt merke til at dette er litt forskjellig fra C ved at globale variabler i C er automatisk tilgjengelige for funksjoner med mindre de har blitt overskrevet av en lokal definisjon. Dette kan forårsake noen problemer ettersom folk ved et uhell kan endre den globale variabelen. I PHP, hvis en global variabel skal brukes i en funksjon, må den erklæres global innenfor funksjonsdefinisjonen.

Nøkkelord global

Først et brukseksempel global:

Eksempel #1 bruk global

$a = 1 ;
$b = 2 ;

funksjon Sum()
{
global $a, $b;

$b = $a + $b ;
}

Sum();
ekko $b ;
?>

Skriptet ovenfor vil sendes ut 3 . Når $a og $b er definert som global inne i en funksjon, vil alle referanser til noen av disse variablene peke til deres globale versjon. Det er ingen grense for antall globale variabler som en funksjon kan håndtere.

Den andre måten å få tilgang til globale omfangsvariabler på er å bruke en spesiell PHP-definert matrise, $GLOBALS . Det forrige eksemplet kan skrives om slik:

$GLOBALS er en assosiativ matrise hvis nøkkel er navnet og verdien er innholdet i den globale variabelen. Legg merke til at $GLOBALS eksisterer uansett omfang, dette er fordi $GLOBALS er superglobal. Nedenfor er et eksempel som viser evnene til superglobaler:

Eksempel #3 Superglobals og omfang

funksjon test_global()
{
// De fleste forhåndsdefinerte variablene er det ikke
// "super" og for å være tilgjengelig i nærområdet
// synlighet, funksjoner krever at "global" spesifiseres.
global $HTTP_POST_VARS ;

Ekko $HTTP_POST_VARS["navn"];

// Superglobals er tilgjengelige i alle omfang
// synlighet og krever ikke at "global" spesifiseres.
// Superglobals er tilgjengelige siden PHP 4.1.0, og
// bruk av HTTP_POST_VARS er avviklet.
echo $_POST ["navn" ];
}
?>

Kommentar:

Søkeordbruk global utenfor funksjonen er ikke en feil. Den kan brukes i en fil som er inkludert i en funksjon.

Bruker statisk ( statisk) variabler

Et annet viktig trekk ved variabelt omfang er statisk variabel. En statisk variabel eksisterer bare i det lokale omfanget av en funksjon, men mister ikke sin verdi når programkjøring forlater dette omfanget. Tenk på følgende eksempel:

Eksempel #4 Demonstrere behovet for statiske variabler

funksjonstest()
{
$a = 0 ;
ekko $a ;
$a++;
}
?>

Denne funksjonen er ganske ubrukelig fordi hver gang den kalles setter den $a til 0 og utganger 0 . Økningen av $a ++-variabelen spiller ingen rolle her, siden $a-variabelen forsvinner når funksjonen avsluttes. For å skrive en nyttig tellefunksjon som ikke mister gjeldende tellerverdi, blir variabelen $a erklært statisk:

Eksempel #5 Eksempel på bruk av statiske variabler

funksjonstest()
{
statisk $a = 0 ;
ekko $a ;
$a++;
}
?>

Nå vil $a bli initialisert bare på det første funksjonskallet, og hvert funksjonskall test() vil skrive ut verdien av $a og øke den.

Statiske variabler gjør det også mulig å arbeide med rekursive funksjoner. En rekursiv funksjon er en som kaller seg selv. Når du skriver en rekursiv funksjon, må du være forsiktig, siden det er en mulighet for å gjøre rekursjonen uendelig. Du må sørge for at det er en adekvat måte å avslutte rekursjonen på. Følgende enkle funksjon teller opp til 10 rekursivt, ved å bruke den statiske variabelen $count for å bestemme når du skal stoppe:

Kommentar:

Statiske variabler kan deklareres som vist i forrige eksempel. Forsøk på å tilordne verdier til disse variablene som er et resultat av uttrykk vil forårsake en behandlingsfeil.

Eksempel #7 Deklarering av statiske variabler

funksjon foo ()(
statisk $int = 0 ; // Ikke sant
statisk $int = 1 + 2 ; // feil (siden det er et uttrykk)
statisk $int = sqrt(121); // feil (siden dette også er et uttrykk)

$int++;
ekko $int ;
}
?>

Kommentar:

Statiske deklarasjoner blir evaluert under skriptkompilering.

Lenker med global ( global) og statisk ( statisk) variabler

Zend Engine 1, som driver PHP 4, behandler statiske og globale variable modifikatorer som referanser. For eksempel en reell global variabel som er innebygd i omfanget av en funksjon ved å spesifisere nøkkelordet global, oppretter faktisk en referanse til en global variabel. Dette kan føre til uventet oppførsel, som vist i følgende eksempel:

funksjon test_global_ref() (
global $obj ;
$obj = &ny stdklasse ;
}

funksjon test_global_noref() (
global $obj ;
$obj = ny standardklasse ;
}

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

Resultatet av å kjøre dette eksemplet: get_instance_noref () (
statisk $obj ;

Ekko "Statisk objekt: ";
var_dump($obj);
if (!isset($obj )) (
// Tilordne et objekt til en statisk variabel
$obj = ny standardklasse ;
}
$obj -> eiendom++;
returner $obj ;
}

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

Resultatet av å kjøre dette eksemplet:

Statisk objekt: NULL
Statisk objekt: NULL

Statisk objekt: NULL
Statisk objekt: objekt(stdClass)(1) (
["property"]=>
int(1)
}

Dette eksemplet viser at når du tilordner en referanse til en statisk variabel, gjør den det ikke minneverdig når du kaller opp funksjonen &get_instance_ref() en gang til.

For å lage en fullverdig nettside med et bredt spekter av funksjoner, må du kunne mye. Imidlertid kan PHP gi et nettsted ekte unikhet. Den globale variabelen brukes ikke ofte i dette programmeringsspråket, men noen ganger er det veldig nyttig å vite hvordan det fungerer.


I denne artikkelen skal vi studere nøyaktig hva en global variabel er og hvordan den fungerer.

Global variabel: omfang

Konteksten som en variabel er definert innenfor kalles dens omfang. Vanligvis har variabler bare ett omfang. Når globale variabler i PHP lastes fra andre filer, kan de kreves eller inkluderes. De er som standard begrenset til det lokale omfanget av funksjonen. Hvordan kan du gjøre en variabel synlig for filer utenfor dens grenser og også være i stand til å bruke den? Det er nettopp derfor PHP gir en global variabel. Nøkkelordet her er "global". Hvordan erklære en global variabel i PHP? For å nå dette målet må ordet "global" brukes. Den må plasseres rett foran variabelen du vil gjøre global. Det ser omtrent slik ut: global "variabel". Etter å ha implementert instruksjoner av denne typen, vil absolutt enhver fil kunne jobbe med data.

Hvis det er referanser til denne variabelen et sted, vil programmet ta hensyn til den globale versjonen. Hvorfor brukes så merkelige formuleringer? Saken er at samtidig kan lokale versjoner også eksistere. Men de vil være mer tilgjengelige utelukkende i filene der de er deklarert. For resten vil globale PHP-klassevariabler gjelde. Her må du handle veldig forsiktig og forsiktig. For å unngå tvil, la oss gi et enkelt eksempel på hvordan de kan se ut: global a. Hvis én fil har tilgang til flere variabler, kan dette forårsake en konflikt. Men det er umulig å si sikkert her om en global eller lokal variabel vil bli lest, eller om en feil vil oppstå. Hvis du skriver det inne i en funksjon, bør det ikke oppstå problemer. Å bruke en variabel utenfor grensene til en funksjon vil være problematisk. Derfor må du nøye overvåke strukturen til koden og sørge for at det ikke er noen forutsetninger for en konflikt hvor som helst.

Globale variabler: En annen notasjon
Finnes det andre måter å sette globale variabler på? Ja, og ikke alene. La oss først se på $GLOBALS. Det er en assosiativ matrise der nøkkelen er navnet. Innholdet i den globale variabelen brukes som verdi. Det er verdt å merke seg at etter erklæringen eksisterer denne matrisen i ethvert omfang. Dette gir grunnlag for å vurdere det som superglobalt. Det ser slik ut: $GLOBALS ['Variable'].

Superglobale
I alle programmeringsspråk er det navn som er reservert for individuelle funksjoner. Det er rett og slett ikke mulig å lage globale variabler med samme navn i PHP. Dette programmeringsspråket har sine egne egenskaper. For eksempel er det spesielt viktig at forhåndsdefinerte variabler ikke har prefikset "super". Dette betyr at de ikke er tilgjengelige alle steder. Hvordan kan denne situasjonen rettes opp? For å gjøre en forhåndsdefinert variabel tilgjengelig på et lokalt nettverk, må du erklære den slik: global "variabel". Dette er allerede nevnt tidligere. Dette er imidlertid ikke helt sant. La oss se på et ekte eksempel:
Global $HTTP_POST_VARS; echo $HTTP_POST_VARS ['navn'].
Føler du forskjellen? Det er verdt å huske på at i PHP må en global variabel brukes i en funksjon. Den kan også ligge i en fil som er inkludert i den.

Sikkerhet og lenker
Som du kan se selv, er det ikke noe problem å lage en global variabel i PHP. Men er det noen spesifikke koblinger? Når du bruker globale variabler, er noe uventet oppførsel mulig. Men før du studerer dette problemet mer detaljert, er det nødvendig å vende seg til bakgrunnen. Register_globals-direktivet ble endret fra aktivert til deaktivert som standard i versjon 4.2. For mange brukere er dette helt uviktig, og forgjeves, fordi sikkerheten til produktet som utvikles avhenger direkte av det. Hvis du trenger å lage en global variabel, vil ikke PHP-direktivet påvirke denne innstillingen direkte. Feil bruk kan imidlertid bli en sikkerhetsrisiko. Så, for eksempel, hvis register_globals er i aktivert tilstand, vil ulike nødvendige variabler initialiseres før koden kjøres. Derfor bestemte de seg for å slå den av. Hvorfor skylder en global variabel mye av sin tilstand til et gitt direktiv? Problemet er at når det var aktivert, klarte ikke utviklerne alltid å svare på spørsmålet om hvor det kom fra, men på den annen side forenklet dette i stor grad prosessen med å skrive kode. Samtidig skapte en slik organisasjon en viss trussel mot sikkerheten. For å unngå datablanding og feil ble direktivet deaktivert. La oss nå se på et eksempel på usikker kode. Vi vil også se på hvordan du kan oppdage tilfeller når deklarasjonen av en global PHP-variabel er ledsaget av et forsøk på å erstatte informasjon. Dette er nødvendig for å lage stabile arbeidssider som ikke kan hackes av den første brukeren som kommer over dem.

Farlige koder
La oss sette variabelen til sann for de brukerne som er autorisert:
If (authenticate_user()) ($authoriza=true;) if ($authorize) (inkluder "/highly/sensitive/data.php";). En variabel i denne tilstanden kan settes automatisk. Tatt i betraktning at dataene ganske enkelt kan erstattes, og kilden til opprinnelsen ikke er fastslått, kan praktisk talt enhver bruker passere en slik sjekk og utgi seg for hvem som helst. En angriper kan om ønskelig forstyrre logikken til hele skriptet. Hvis du endrer verdien på direktivet, vil koden fungere riktig. Det er akkurat dette vi må gjøre. Initialisering av variabler er imidlertid ikke bare en god praksis blant programmerere, det garanterer også stabiliteten til skriptet.

Pålitelig alternativ
For å oppnå dette målet, kan du prøve å deaktivere direktivet, eller skrive mer kompleks kode, for eksempel slik: if (isset($_SESSION ['brukernavn'])) (ekko “Hei” ($_SESSION ['brukernavn') ])”;) else (ekko “Hei gjest”; ekko “Velkommen!”;). I dette tilfellet vil det være vanskelig å gjøre en erstatning. Det er imidlertid mulig. For å gjøre dette må du på forhånd ta vare på tilgjengeligheten av hurtigresponsverktøy. Hvis du trenger å inkludere globale variabler i PHP, kan du bruke følgende verktøy: hvis du vet nøyaktig i hvilket område verdien vil bli mottatt, kan du skrive det på en slik måte at skriptet sjekker dette faktum ved sammenligning. Dette kan selvsagt heller ikke garantere 100 % beskyttelse mot verdisubstitusjon. Å gå gjennom de mulige alternativene vil imidlertid komplisere operasjonen betydelig.

Hvordan oppdager du et forsøk på spoofing?
La oss nå sjekke om du forsto alt som er skrevet riktig. Du må selv deklarere globale variabler i en funksjon. Dette er en slags lekser. Først, her er koden:

La oss gi noen forklaringer. Variabelen C_COOKIE er hentet fra en pålitelig kilde. For å sikre at resultatet er som forventet, kontrolleres variabelens verdi. Hvis det oppstår problemer, mottar administrator et varsel. Hvis ingenting skjer, vil ingen tiltak bli iverksatt.