Ves al contingut principal

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.

image.png

Exemple

Aquest mètode permet tant llegir com modificar el valor de la variable global des de dins de la funció.

PHP

<?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 $GLOBALS fins que se li assigni un valor.

Exemple

PHP

<?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

<?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>";
?>
  1. Quan utilitzes global $nom;, el PHP crea una entrada per a $nom a l'àmbit global i li assigna NULL implí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ó.

  2. 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.