Variables global vs $GLOBALS
A PHP, l'àmbit o scope de les variables és local per defecte dins de les funcions. Per fer accessible una variable definida fora d'una funció (àmbit global) dins d'aquesta, hi ha dues tècniques principals: la paraula clau global i l'ús de l'array $GLOBALS.
Array $GLOBALS
L'array $GLOBALS és la forma més fiable i consistent d'accedir a les variables globals.
Característiques
-
Superglobal: És un array associatiu que està disponible sempre a qualsevol àmbit (dins de funcions, classes o fitxers), sense necessitat de fer-la global explícitament.
-
Estructura: Emmagatzema totes les variables definides a l'àmbit global del script. La clau de l'array és el nom de la variable i el valor és el contingut d'aquesta variable.
Exemple
Aquest mètode permet tant llegir com modificar el valor de la variable global des de dins de la funció.
<?php
$comptador_global = 10; // Variable a l'àmbit global
function incrementa_global_array() {
// Accedim i modifiquem la variable global usant l'array $GLOBALS
$GLOBALS['comptador_global'] += 5;
}
incrementa_global_array();
echo "Valor després d'usar \$GLOBALS: " . $comptador_global; // Sortida: 15
?>
La paraula global
La paraula clau global s'utilitza dins d'una funció per importar una variable que ja existeix a l'àmbit global cap a l'àmbit local de la funció, creant un àlies o una referència.
Característiques
-
Àmbit local: Has de declarar-la dins de la funció perquè funcioni.
-
Referència: La declaració
global $x;no crea una còpia; crea un enllaç al valor de la variable a l'àmbit global. Qualsevol canvi fet dins de la funció afectarà la variable global original. -
Menys robusta: Si la variable global no existeix,
global $x;crea una variable local sense valor (NULL) que no estarà enllaçada al$GLOBALSfins que se li assigni un valor.
Exemple
<?php
$comptador_global = 10; // Variable a l'àmbit global
function incrementa_global_keyword() {
// Declarem la variable global a l'àmbit local
global $comptador_global;
// Treballem directament amb la variable
$comptador_global += 5;
}
incrementa_global_keyword();
echo "Valor després d'usar global: " . $comptador_global; // Sortida: 15
?>
Quin Mètode Escollir?
| Característica | Paraula Clau global |
Array $GLOBALS |
| Declaració | Ha de ser declarada dins de la funció. | Accés directe en qualsevol lloc. |
| Performance | Lleugerament més ràpida (evita la cerca a l'array). | Lleugerament més lenta (cerca en l'array). |
| Legibilitat | Més neta i concisa per al desenvolupador. | Més explícita i fàcil d'identificar que és una variable global. |
| Ús Comú | Preferida en codi heretat o per simplicitat. | Més utilitzada avui per ser més explícita i evitar confusions d'àmbit. |
Recomanació: L'ús de $GLOBALS és generalment considerat una pràctica lleugerament millor, ja que fa explícita la intenció de modificar una variable global i és consistent amb la resta de superglobals de PHP (com $_POST, $_GET, $_SESSION).
$GLOBALS crea la variable a l'àmbit global de manera immediata, mentre que global només crea la referència a l'àmbit local fins que li assignes un valor.
Comparativa de variables Globals no existents
| Mètode | Acció Dins de la Funció | Estat Final de l'Àmbit Global |
global |
Només crea una referència local a una variable global inexistent. | La variable global existeix, però amb valor NULL. |
$GLOBALS |
Crea la variable directament a l'array superglobal. | La variable global existeix amb el valor assignat. |
<?php
// ----------------------------------------
// ESCENARI 1: Usant la Paraula Clau 'global'
// ----------------------------------------
function crear_variable_amb_global() {
global $variable_global_keyword;
// Si no assignem res, PHP la tracta com a NULL a l'àmbit local
}
crear_variable_amb_global();
echo "<h2>1. Amb la paraula clau 'global':</h2>";
if (isset($variable_global_keyword)) {
echo "La variable \$variable_global_keyword **existeix** a l'àmbit global.<br>";
echo "Valor: **" . var_export($variable_global_keyword, true) . "** (És NULL per defecte).";
} else {
echo "ERROR: La variable no es va crear.";
}
echo "<hr>";
// ----------------------------------------
// ESCENARI 2: Usant l'Array Superglobal '$GLOBALS'
// ----------------------------------------
function crear_variable_amb_globals_array() {
// Assignem un valor directament a l'array superglobal
$GLOBALS['variable_global_array'] = "Creat amb \$GLOBALS";
}
crear_variable_amb_globals_array();
echo "<h2>2. Amb l'array superglobal \$GLOBALS:</h2>";
// Accedim directament a la variable creada
if (isset($variable_global_array)) {
echo "La variable \$variable_global_array **existeix** a l'àmbit global.<br>";
echo "Valor: **$variable_global_array**";
} else {
echo "ERROR: La variable no es va crear.";
}
// També podem comprovar-ho mirant l'array $GLOBALS
// echo "<pre>"; print_r($GLOBALS['variable_global_array']); echo "</pre>";
?>
-
Quan utilitzes
global $nom;, el PHP crea una entrada per a$noma l'àmbit global i li assignaNULLimplícitament. És a dir, la variable existeix, però no té un valor significatiu fins que se li assigni explícitament un valor dins de la funció. -
Quan utilitzes
$GLOBALS['nom'] = valor;, estàs injectant el nom i el valor directament a l'array de variables globals, garantint que la variable existeixi i tingui el valor que li has donat immediatament.
Per aquesta raó, molts programadors prefereixen $GLOBALS perquè és més explícita sobre la seva intenció de modificar o crear dades globals persistents.