Varijable u PHP-u. Kako prikazati vrijednosti svih varijabli okruženja u sustavu Windows Što su superglobali

03.04.2021 Savjet

Sigurno kod kuće imate ormar ili komodu. Princip njihove upotrebe je jednostavan: tamo stavljamo stvari koje nam trenutno nisu potrebne, ali će nam možda zatrebati za neko vrijeme.

Varijable su raspoređene potpuno isto. Možete staviti neku vrijednost u njih i tamo ih pohraniti dok vam ne zatrebaju.

Stvaranje varijabli

Možete staviti vrijednost u varijablu ovako:

U gornjem kodu stvorili smo varijablu $name i u nju stavili vrijednost Ivan, zatim smo kreirali varijablu $age i dodijelili joj vrijednost 20.

Naziv "varijabla" znači da se njezina vrijednost može promijeniti tijekom izvođenja skripte:

U nekim jezicima varijabla se prvo mora "deklarirati", a zatim koristiti. U PHP deklaracije ne - varijabla se kreira u trenutku kada u nju stavite vrijednost.
Međutim, PHP programeri često kažu "deklariraj varijablu" umjesto "kreiraj varijablu".

Također, umjesto "stavite u varijabilna vrijednost" se često kaže da "dodjeljuje vrijednost".
Razlog je jednostavan - simbol =, zahvaljujući kojem pohranjujemo vrijednost u varijablu, naziva se "operator dodjele". Odatle i izraz "prikladno".

Pravila imenovanja varijabli

1. Naziv varijable počinje simbolom $.

2. Drugi znak može biti slovo ili podvlaka _

Nazivi varijabli razlikuju velika i mala slova. $name i $Name su različite varijable.

Prikaz vrijednosti varijable na ekranu

Možete prikazati varijablu pomoću naredbe echo koju već poznajemo:

Naredba echo omogućuje prikaz više vrijednosti odjednom:

Primijetite da smo proslijedili 2 vrijednosti za echo, odvojene zarezom. Na ovaj način možemo proslijediti onoliko vrijednosti koliko želimo. Sljedeća dva primjera dat će isti rezultat:

Postoji i skraćena sintaksa za prikaz varijabli u PHP-u. Umjesto

Prije PHP-a 5.4, skraćena sintaksa radila je samo kada je omogućena u postavkama PHP direktive short_open_tag, koji također omogućuje korištenje skraćene početne oznake

Provjera vrijednosti varijable

Naredba echo nije uvijek prikladna za provjeru trenutne vrijednosti varijable. Na primjer, ako pokušate prikazati prazan niz "", na zaslonu se neće prikazati apsolutno ništa. I nije jasno koji je razlog - prazna varijabla ili neispravan kod.

Stoga se za provjeru vrijednosti varijable koristi funkcija var_dump():

Rezultat izvršenja skripte:

String(5) "Vasya" string(0) ""

Kao što vidite, PHP nije prikazao samo sadržaj varijable, već i broj znakova, pa čak i tip varijable (string). Detaljno ćemo pogledati tipove podataka u sljedećim lekcijama.

Uklanjanje varijabli

Možete ukloniti postojeću varijablu pomoću funkcije unset():

Sada je vrijeme da malo vježbate.

Zapamtite, gotovo svaki PHP problem može imati više rješenja. Dakle, ako se vaša rješenja razlikuju od onih napisanih na ovim stranicama, to uopće ne znači da ste učinili nešto krivo.

Napišite skriptu koja:
1. Stvara varijable s imenima title i content i nekim vrijednostima.
2. Prikazuje vrijednost varijable naslova unutar oznake h1 i vrijednost varijable sadržaja unutar oznake div.

Prikaži rješenje

", $title, ""; jeka "

", $sadržaj, "
"; ?>

Još jednom skrećem pozornost da ova odluka nije jedina ispravna. Na primjer, sljedeći kod će dati isti rezultat:

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

Kada počnete učiti PHP i počnete raditi s funkcijama i objektima, opseg varijable je pomalo zbunjujući. Srećom, pravila PHP-a u tom pogledu su vrlo laka za razumijevanje (u usporedbi s drugim programskim jezicima).

Što je opseg?

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

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

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

Varijable s globalnim opsegom nazivamo globalnim, dok varijable s lokalno područje vidljivost – lokalna.

Evo primjera kako funkcioniraju globalne i lokalne varijable.

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

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

U ovoj skripti stvorili smo dvije varijable:

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

Nakon kreiranja varijable i funkcije, skripta poziva sayHello(), koja ispisuje "Hello Harry!" . Skripta zatim pokušava ispisati vrijednosti dviju varijabli pomoću funkcije echo. Evo što se događa:

  • Jer $globalnoName je stvoren izvan funkcije, dostupan je bilo gdje u skripti, tako da je izlaz "Zoe".
  • $localName bit će dostupan samo unutar funkcije sayHello(). Budući da je echo izraz izvan funkcije, PHP ne omogućuje pristup lokalnoj varijabli. Umjesto toga, PHP očekuje da kôd stvori novu varijablu pod nazivom $localName, koja će imati zadanu vrijednost praznog niza. zato drugi poziv echo daje vrijednost "" za varijablu $localName.

Pristup globalnim varijablama unutar funkcije

Za pristup globalnoj varijabli izvan funkcije Dovoljno je samo napisati njezino ime. Ali za pristup globalnoj varijabli unutar funkcije, prvo morate deklarirati varijablu kao globalnu u funkciji pomoću ključne riječi global:

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

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

Evo primjera skripte koja koristi globalnu varijablu unutar funkcije:

"; global $globalName; echo "Zdravo $globalName!
"; ) sayHello(); ?>

Kada se izvrši, skripta će ispisati:

Bok Harry! Pozdrav Zoya!

Funkcija sayHello() koristi ključna riječ global za deklariranje varijable $globalName kao globalne. Zatim može pristupiti varijabli i ispisati njezinu vrijednost ("Zoe").

Što su superglobali?

PHP ima poseban skup unaprijed definiranih globalnih nizova koji sadrže razne informacije. Takvi se nizovi nazivaju superglobali, budući da su dostupni s bilo kojeg mjesta u skripti, uključujući interni funkcijski prostor, i ne moraju se definirati korištenjem ključne riječi global.

Ovdje je popis superglobala dostupnih u PHP verzije 5.3:

  • $GLOBALS - popis svih globalnih varijabli u skripti (isključujući superglobale)
  • $_GET - sadrži popis svih polja obrasca koje je preglednik poslao pomoću GET zahtjeva
  • $_POST - sadrži popis svih polja obrasca koje je preglednik poslao pomoću POST zahtjeva
  • $_COOKIE - sadrži popis svih kolačića koje šalje preglednik
  • $_REQUEST - sadrži sve kombinacije ključ/vrijednost koje su sadržane u nizovima $_GET, $_POST, $_COOKIE
  • $_FILES - sadrži popis svih datoteka koje je preuzeo preglednik
  • $_SESSION - omogućuje pohranjivanje i korištenje varijabli sesije za trenutni preglednik
  • $_SERVER - sadrži informacije o poslužitelju, kao što je naziv datoteke skripte koja se izvršava i IP adresa preglednika.
  • $_ENV - sadrži popis varijabli okruženja proslijeđenih PHP-u, kao što su CGI varijable.
Na primjer, možete upotrijebiti $_GET za dobivanje vrijednosti varijabli zatvorenih u nizu URL-a zahtjeva skripte i njihovo prikazivanje na stranici:

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

Pozdrav Fred!

Upozorenje! U pravoj skripti takav se prijenos podataka nikada ne bi trebao koristiti zbog slabe sigurnosti. Uvijek biste trebali potvrditi ili filtrirati podatke.

$GLOBALS superglobal vrlo je zgodan za korištenje jer vam omogućuje organiziranje pristupa globalnim varijablama u funkciji bez potrebe za ključnom riječi global. Na primjer:

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

Statičke varijable: one su tu negdje

Kada stvorite lokalnu varijablu unutar funkcije, ona postoji samo dok je funkcija pokrenuta. Kada funkcija završi, lokalna varijabla nestaje. Kada se funkcija ponovno pozove, stvara se nova lokalna varijabla.

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

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

Da biste stvorili statičku varijablu u funkciji, trebate upotrijebiti ključnu riječ static prije naziva varijable i svakako je postaviti početna vrijednost. Na primjer:

Funkcija myFunction() ( static $myVariable = 0; )

Razmotrimo situaciju kada je prikladno koristiti statičku varijablu. Recimo da stvorite funkciju koja, kada se pozove, stvara widget i prikazuje broj već stvorenih widgeta. Možete pokušati napisati kod poput ovog koristeći lokalnu varijablu:


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

No, budući da se varijabla $numWidgets kreira svaki put kada se funkcija pozove, dobit ćemo sljedeći rezultat:

Izrađujemo neke widgete... Već smo izradili 1. Već smo kreirali 1. Već smo kreirali 1.

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

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

Sada će skripta dati očekivani rezultat:

Izrađujemo neke widgete... Već smo izradili 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 se skripta izvodi. Nakon što skripta završi s izvođenjem, sve statičke varijable se uništavaju, kao i lokalne i globalne varijable.

To je sve! Često provjeravajte svoju PHP dokumentaciju.

Varijable okruženja u sustavu Windows sadrže različite informacije o postavkama sustava i korisničkom okruženju. Razlikuju se varijable okoline korisnika, sustava i procesa.

Najlakši način da pogledate sadržaj varijabli okruženja u sustavu Windows je da otvorite Svojstva sustava ( sysdm.cpl) -> Napredno -> Varijable okruženja. Kao što vidite, u prozoru koji se otvori postoje dva odjeljka: gornji sadrži varijable okruženja korisnika, a donji sistemske.

Osim toga, varijable okruženja pohranjene su u registru sustava. Korisničke varijable pohranjene su u . Sustav - u HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.

Možete prikazati vrijednosti svih varijabli okruženja u naredbenom retku Windows linija. Naredba je jednostavna:

Naredba će ispisati varijable okoline i njihove vrijednosti.

U PowerShell-u možete koristiti naredbu za prikaz svih varijabli okoline:

Ako trebate prikazati vrijednost samo jedne varijable, potrebno je koristiti naredbu echo, a naziv varijable mora biti u znaku postotka. Na primjer,

Echo %systemroot%

postavi > c:\tmp\env_var.txt

Varijable okoline za određeni proces mogu se dobiti pomoću besplatne Pomoćni programi Process Explorer(iz Sysinternalsa). Samo otvorite svojstva procesa i idite na karticu Okoliš.

prije 13 godina

Mali problem na koji treba pripaziti:

Ako isključite RegisterGlobals i srodne, a zatim koristite get_defined_vars(), mogli biste vidjeti nešto poput sljedećeg:

Niz
[ GLOBALI ] => Niz
[ GLOBALI ] => Niz
*REKURZIJA*
[ _POST ] => Array()
[ _GET ] => Array()
[ _COOKIE ] => Array()
[ _FILES ] => Array()
)

[ _POST ] => Array()
[ _GET ] => Array()
[ _COOKIE ] => Array()
[ _FILES ] => Array()

)
?>

Primijetite da $_SERVER nije tamo. Čini se da php učitava samo superglobalni $_SERVER ako se negdje koristi. Možete učiniti ovo:

ispis"

" . htmlspecialchars(print_r(get_defined_vars(), true))."
" ;
ispis"
" . htmlspecialchars (print_r ($_SERVER , true )) . "
" ;
?>

I tada će se $_SERVER pojaviti na oba popisa. Pretpostavljam da to baš i nije nešto loše, jer se ništa loše neće dogoditi ni u jednom slučaju, ali je svejedno zanimljiva zanimljivost.

prije 6 godina

Budući da get_defined_vars() dobiva samo varijable u trenutku kada pozovete funkciju, postoji jednostavan način da se varijable definiraju unutar trenutnog opsega.

// Sam vrh vaše php skripte
$vars = get_defined_vars();

// Sada radite svoje
$foo = "foo" ;
$bar = "bar" ;

// Dobivanje svih varijabli definiranih u trenutnom opsegu
$vars = array_diff(get_defined_vars(), $vars);

jeka "

"
;
print_r($vars);
jeka "
" ;
?>

prije 15 godina

Ovdje je funkcija koja generira izvješće o otklanjanju pogrešaka za prikaz ili e-poštu
koristeći get_defined_vars. Izvrstan za dobivanje detaljne snimke bez
oslanjajući se na korisnički unos.

funkcija generateDebugReport ($method, $defined_vars, $email = "undefined" )(
// Funkcija za izradu izvješća o otklanjanju pogrešaka za prikaz ili e-poštom.
// Upotreba: generateDebugReport(method,get_defined_vars(),email);
// Gdje je metoda "preglednik" ili "e-pošta".

// Kreirajte popis zanemarivanja za ključeve koje vraća "get_defined_vars".
// Na primjer, HTTP_POST_VARS, HTTP_GET_VARS i drugi jesu
// redundantno (isto kao _POST, _GET)
// Također uključite vars koje želite zanemariti iz sigurnosnih razloga - tj. PHPSESSID.
$ignorelist =array("HTTP_POST_VARS" , "HTTP_GET_VARS" ,
"HTTP_COOKIE_VARS" , "HTTP_SERVER_VARS" ,
"HTTP_ENV_VARS", "HTTP_SESSION_VARS",
"_ENV", "PHPSESSID", "SESS_DBUSER",
"SESS_DBPASS", "HTTP_COOKIE");

$vremenska oznaka = datum ("m/d/g h:m:s");
$message = "Izvješće o otklanjanju pogrešaka stvoreno $timestamp \n" ;

// Dobivanje zadnje SQL pogreške za dobru mjeru, gdje je $link identifikator resursa
// za mysql_connect. Ostavite komentar ili izmijenite za svoju bazu podataka ili postavku apstrakcije.
globalna $link ;
$sql_greška = mysql_greška($link);
if($sql_error )(
$message .= "\nMysql poruke:\n" . mysql_greška($link);
}
// Završi MySQL

// Ovdje se može koristiti rekurzivna funkcija. Shvatili ste ;-)
foreach($defined_vars kao $key => $val )(
if(is_array ($val) && ! in_array ($key, $ignorelist) && count ($val) > 0 )(
$message .= "\n niz $ključeva (ključ=vrijednost):\n" ;
foreach($val kao $subkey => $subval )(
if(! in_array ($subkey, $ignorelist) && ! is_array ($subval))(
$message .= $podključ. " = ". $podval. "\n" ;
}
elseif(! in_array ($subkey, $ignorelist) && is_array ($subval))(
foreach($subval kao $subsubkey => $subsubval )(
if(! in_array ($subsubkey, $ignorelist))(
$message .= $subsubkey . " = ". $podpodval. "\n" ;
}
}
}
}
}
inače ako(!
je_niz ($val) && ! in_array ($key, $ignorelist) && $val)(
$message .= "\nVarijabla " . $ključ . " = ". $val. "\n" ;
}
}

If($method == "preglednik" )(
echo nl2br($poruka);
}
elseif($method == "e-mail" )(
if($email == "undefined" )(
$email = $_SERVER [ "SERVER_ADMIN" ];
}

$mresult = pošta ($email, "Izvješće o otklanjanju pogrešaka za ". $_ENV [ "HOSTNAME"]. "", $message);
if($mresult == 1 )(
jeka "Izvješće o otklanjanju pogrešaka uspješno je poslano.\n";
}
drugo(
jeka "Neuspješno slanje izvješća o otklanjanju pogrešaka.\n";
}
}
}
?>

prije 17 godina

Jednostavna rutina za pretvaranje get_defined_vars objekta u XML.

funkcija obj2xml ($v, $indent = "" ) (
dok je (popis($ključ, $val) = svaki ($v)) (
if ($key == "__attr" ) nastavi;
// Provjerite __attr
if (je_objekt ($val -> __attr)) (
dok (list($key2, $val2) = svaki ($val -> __attr)) (
$attr .= " $key2 =\" $val2 \"" ;
}
}
else $attr = "" ;
if (je_niz ($val) || je_objekt ($val)) (
print(" $uvlaka< $key$attr >\n" );
obj2xml($val, $uvlaka. "");
print(" $uvlaka\n" );
}
else print(" $uvlaka< $key$attr >$val\n" );
}
}

//Primjer objekta
$x -> ime -> prvi = "Ivan" ;
$x -> ime -> prezime = "Smith" ;
$x -> arr [ "Voće" ] = "Banana" ;
$x -> arr [ "Povrće" ] = "Mrkva" ;
$y -> korisnik = $x ;
$y -> kupac -> __attr -> id = "176C4" ;

$z = get_defined_vars();
obj2xml($z["y"]);
?>
će ispisati:


Ivan
Smith


Banana
Mrkva

prije 11 godina

Kao napomena, get_defined_vars() ne vraća skup referenci varijabli (kao što sam se nadao). Na primjer:

// definirati varijablu
$my_var = "foo" ;

// dobivanje našeg popisa definiranih varijabli
$defined_vars = get_defined_vars();

// sada pokušajte promijeniti vrijednost kroz vraćeni niz
$defined_vars [ "my_var" ] = "bar" ;

echo $my_var , "\n" ;

?>

će ispisati "foo" (izvorna vrijednost). Bilo bi lijepo kada bi get_defined_vars() imao izborni argument da ih napravi referencama, ali pretpostavljam da je to prilično specijaliziran zahtjev. Možete to učiniti sami (manje zgodno) s nečim poput:

$defined_vars = array();
$var_names = array_keys(get_defined_vars());

foreach ($var_names kao $var_name)
{
$defined_vars [ $var_name ] =& $ $var_name ;
}

?>

prije 1 godinu

Prije sam ovdje objavio o tome da je "ovo" u get_defined_vars.

Ispostavilo se da nije uvijek tu, ali u određenim slučajevima će se neobjašnjivo pojaviti.

Php -r "
razredni test (
javna funkcija a() (var_dump(array_keys(get_defined_vars()));$a = 123;)
javna funkcija b() (var_dump(array_keys(get_defined_vars()));$this;)
}
$t = novi test();
$t->a();
$t->b();
"

Niz()
niz("ovo")

Ovo se ne događa u PHP 7.2, ali će se dogoditi u PHP 5.6.

prije 1 godinu

Neki komentari ovdje ističu da ova funkcija neće vratiti reference. Međutim, vraća imena, a imena su "reference".

Ovdje ne bih preporučio prijedloge koji to pretvaraju u reference.

Javna funkcija x($a, $b, $c) (
foreach(array_keys(get_defined_vars()) kao $key)
if($key !== "ovo")
$ovo->y($($ključ));
}

Javna funkcija y(&$input) (
$input++;
}

Umjesto $() možete koristiti i $$.

Radio sam neke čudne stvari u svoje vrijeme kako bih napravio krajnje generički kod, ali nikada nisam morao učiniti nešto poput gore navedenog. Možda čak i ne bi uspjelo (ali trebalo bi jer se ne razlikuje od $a[$key]).

Mogli biste napraviti i $$key++, ali nikad nisam vidio takav kod koji nije bio užasno loš (upotreba dinamike tamo gdje dinamika nije korisna).

Ako radite tako nešto, onda to dodatno proučite.