¿Qué tan «globales» son las variables globales en PHP?

Parece una pregunta rara, ¿no?

Seguro estás pensando «¿Dónde está la trampa?», ¿cierto?

En general se entiende que una variable global es aquella que está presente (es decir, puede ser leída y modificada) en cualquier lugar de un programa.

El caso de PHP es algo particular.

Para comenzar si hicieras algo como esto:

<?php

$global = 'Soy una variable global';

function f()
{
   echo '$global dentro de f vale: "'.$global.'"'.PHP_EOL;
}

echo '$global fuera de f vale: "'.$global.'"'.PHP_EOL;
f();

Esperarías ver:

 $global fuera de f vale: "Soy una variable global"
 $global dentro de f vale: "Soy una variable global"

Y sin embargo, si ejecutás este script verás:

$global fuera de f vale: "Soy una variable global"
$global dentro de f vale: ""

Y, en el reporte de errores encontrarás:

PHP Notice: Undefined variable: global on line 7

Esto ocurre debido a que en PHP, si querés acceder a una variable definida fuera del ámbito de la función que se está ejecutando debés hacerlo en forma explícita.

Cómo usar variables globales en PHP

Hay dos formas de hacer esto.

La primera es referirte a la variable como un miembro del arreglo $GLOBALS

function f()
{
   echo '$global dentro de f vale: "'.$GLOBALS['global'].'"'.PHP_EOL;
}

La segunda es declarar que vas a usar una variable global:

function f()
{
        GLOBAL $global;

        echo '$global dentro de f vale: "'.$global.'"'.PHP_EOL;
}

Hasta aquí puede resultar algo raro, pero no deja de ser un tema de sintaxis… nada del otro mundo.

El problema se hace algo más complejo cuando pensamos en acceder a una variable definida en otro script, algo como:

script1.php

<?php

$global = "Soy una variable global";
?>
<a href="script2.php">Ir al script 2</a>

script2.php

<?php

echo '$global en script2 vale "'.$global.'"'.PHP_EOL;

Si accedés al script1.php a través de un servidor web y hacés click en el link «Ir al script 2» te vas a encontrar con un error de que la variable $global no está definida.

Y aquí es donde empiezan las confusiones.

¿Acaso script1.php y script2.php no forman parte de la misma aplicación?

Bueno… sí y no.

Conceptualmente todos los scripts que armaste para tu sitio están vinculados de alguna forma, por algo están todos ahí.

Sin embargo, a un nivel técnico no, cada script es independiente de su contexto.

Esto es así por el modelo de ejecución de PHP.

A diferencia de otros lenguajes o entornos donde la aplicación y el webserver son una y la misma cosa (NodeJs por ejemplo), en PHP la separación es muy clara.

Cada petición que recibe el servidor web (y que corresponde a un archivo php) es pasado a través de un hilo nuevo del intérprete.

Esto implica justamente que al finalizar un script todo el espacio de memoria utilizado por éste se destruye… incluso las variables globales 🙁

Entonces… ¿se puede compartir variables entre diferentes scripts de una aplicación PHP?

Sí, se puede.

Cómo compartir variables entre scripts de una aplicación PHP

Depende de cuál sea exactamente el resultado buscado existen diferentes formas de lograrlo.

Si lo que se busca es guardar variables que acompañen a un visitante a lo largo de su camino de navegación lo mejor es utilizar el mecanismo de sesiones.

Si lo que se busca es algo más abarcativo, como definir variables que perduren entre la ejecución de diferentes scripts aún cuando no se trate del mismo usuario, habrá que recurrir a algún medio de almacenamiento externo a PHP.

Entre ellos están los archivos, las bases de datos, espacios de memoria compartidos, etc…

Espero haber contribuido a aclarar un poco este punto que suele traer problemas cuando uno comienza su recorrido en el mundo del PHP.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

1 comentario

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.