global / $GLOBALS în PHP

Face vizibilă într-o funcție o variabilă definită în afara oricărei funcții.

Sintaxă
global $variabila;

Ce face global / $GLOBALS

Variabilele din PHP au domeniu (scope). O variabilă definită în afara funcțiilor nu este vizibilă în interiorul unei funcții, iar variabilele din funcție dispar la sfârșitul ei. global $x; leagă variabila locală $x de variabila globală cu același nume.

Același lucru se poate face prin tabloul special $GLOBALS["x"], disponibil peste tot.

Variabilele globale fac codul greu de urmărit și de testat: orice funcție le poate schimba. De cele mai multe ori este mai bine să trimiți valoarea ca parametru și să o returnezi.

Exemple

Exemplul 1: Fără și cu global

<?php
$vizitatori = 10;

function fara(): void
{
    echo isset($vizitatori) ? "văd variabila\n" : "nu văd variabila\n";
}

function cu(): void
{
    global $vizitatori;
    $vizitatori++;
    echo "vizitatori = $vizitatori\n";
}

fara();
cu();
echo "în afară: $vizitatori";

Rezultat

nu văd variabila
vizitatori = 11
în afară: 11

Exemplul 2: $GLOBALS și varianta recomandată

<?php
$moneda = "lei";

function pret(float $suma): string
{
    return $suma . " " . $GLOBALS["moneda"];
}

function pretCuParametru(float $suma, string $moneda): string
{
    return "$suma $moneda";
}

echo pret(49.9) . "\n";
echo pretCuParametru(49.9, $moneda);

Rezultat

49.9 lei
49.9 lei

Greșeli frecvente

  • Te aștepți ca o variabilă din afara funcției să fie disponibilă automat, ca în JavaScript. În PHP nu este: primești Undefined variable.
  • Folosești global pentru conexiunea la baza de date în zeci de funcții. Trimite conexiunea ca parametru sau ține-o într-un obiect.

Comenzi înrudite

  • function: Definește o funcție proprie: un bloc de cod cu nume, pe care îl poți apela de oricâte ori.
  • function () use / fn: O funcție fără nume, salvată într-o variabilă sau dată direct altei funcții. Poate folosi variabile din exterior cu use.
  • static / self::: Membrii static aparțin clasei, nu unui obiect anume. Se apelează cu NumeClasa::metoda(), fără new.