Ámbito de las variables en PHP

El ámbito de las variables (o scope) divide un script PHP en entornos, lo que afecta a la definición y uso de las variables

Contenido modificable

Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request. Gracias

Las variables que se declaran fuera de funciones o clases se encuentran en el ámbito global (global scope), disponibles en cualquier parte del script.

Las funciones son bloques independientes, las variables que se definen dentro de una función tienen ámbito local (local scope) y no afectan a otras en el script global, de la misma forma que las variables globales no están disponibles dentro de las funciones:

function saludar()
{
    $saludo = "Hola";
    print $saludo;
}

$saludo = "Buenos dias";
saludar(); // Devuelve: Hola
print $saludo; // Devuelve: Buenos días

La ejecución del script empieza en $saludo = "Buenos días", y después llama a la función saludar(). Esta función establece $saludo a "Hola" y lo imprime, y después devuelve el control al script principal donde se imprime $saludo. Puede comprobarse que sus valores son diferentes y no se afecta el uno al otro.

Es posible emplear una variable global dentro de una función con la palabra global o con el array $GLOBALS:

// --- Ejemplo con la palabra global
$x = 2;
$y = 20;

function suma()
{
    global $x, $y;
    return $x + $y;
}

echo suma(); // Devuelve: 22
// --- Ejemplo con $GLOBALS
$x = 4;
$y = 21;

function otraSuma()
{
    return $GLOBALS['x'] + $GLOBALS['y'];
}

echo otraSuma(); // Devuelve 25

Cuando se hace global a una variable, es lo mismo que referenciar el nombre de la misma al elemento GLOBALS en cuestión:

$x = 10;
function funcionUno(){
    global $x;
    $x++;
    return $x;
}
function funcionDos(){
    $x =& $GLOBALS['x'];
    $x++;
    return $x;
}
funcionUno();
funcionDos();
echo $x; // Devuelve: 12

La diferencia entre utilizar la palabra global y el array $GLOBALS se produce cuando se hacen referencias dentro de las funciones:

$x = "Soy X";
$y = "Soy Y";
function funcionUno()
{
    global $x, $y;
    $y =& $x;
}
function funcionDos(){
    global $x;
    $GLOBALS['y'] =& $x;
}
funcionUno();
echo $y; // Devuelve: Soy Y
funcionDos();
echo $y; // Devuelve: Soy X

En funcionUno() se han importado $x e $y con la palabra global y se ha referenciado $y a $x, pero esto ha ocurrido sólo dentro de la función. En funcionDos() se ha empleado $GLOBALS con $y y su valor ha permanecido referenciado después de la función.

Categoría Publicado GUARDAR CAMBIOS Volver al listado Cuidado con este botón, no hay vuelta atrás: