Ámbito de las variables
El ámbito de una variable es el contexto dentro del que la variable está
definida. La mayor parte de las variables PHP sólo tienen un ámbito
simple. Este ámbito simple también abarca los ficheros incluídos y los
requeridos. Por ejemplo:
Aquí, la variable $a estará disponible al interior del
script incluido b.inc. Sin embargo, al interior de
las funciones definidas por el usuario se introduce un ámbito local a la
función. Cualquier variable usada dentro de una función está, por
omisión, limitada al ámbito local de la función. Por ejemplo:
Este script no producirá salida, ya que la sentencia echo utiliza una
versión local de la variable $a, a la que no se ha
asignado ningún valor en su ámbito. Puede que usted note que hay una
pequeña diferencia con el lenguaje C, en el que las variables globales
están disponibles automáticamente dentro de la función a menos que sean
expresamente sobreescritas por una definición local. Esto puede causar
algunos problemas, ya que la gente puede cambiar variables globales
inadvertidamente. En PHP, las variables globales deben ser declaradas
globales dentro de la función si van a ser utilizadas dentro de dicha
función.
La palabra clave global
En primer lugar, un ejemplo de uso de global
:
Ejemplo #1 Uso de global
<?php
$a = 1;
$b = 2;
function Suma()
{
global $a, $b;
$b = $a + $b;
}
Suma();
echo $b;
?>
El script anterior producirá la salida 3
. Al declarar
$a y $b globales dentro de la
función, todas las referencias a tales variables se referirán a la
versión global. No hay límite al número de variables globales que se
pueden manipular dentro de una función.
Un segundo método para acceder a las variables desde un ámbito global es
usando el array $GLOBALS. El ejemplo anterior se
puede reescribir así:
Ejemplo #2 Uso de $GLOBALS en lugar de global
<?php
$a = 1;
$b = 2;
function Suma()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Suma();
echo $b;
?>
El array $GLOBALS es un array asociativo con el
nombre de la variable global como clave y los contenidos de dicha
variable como el valor del elemento del array.
$GLOBALS existe en cualquier ámbito, esto ocurre ya
que $GLOBALS es una superglobal. Aquí hay un
ejemplo que demuestra el poder de las superglobales:
Ejemplo #3 Ejemplo que demuestra las superglobales y el ámbito
<?php
function test_global()
{
// La mayoría de variables predefinidas no son "super" y requieren
// 'global' para estar disponibles al ámbito local de las funciones.
global $HTTP_POST_VARS;
echo $HTTP_POST_VARS['name'];
// Las superglobales están disponibles en cualquier ámbito y no
// requieren 'global'. Las superglobales están disponibles desde
// PHP 4.1.0, y ahora HTTP_POST_VARS se considera obsoleta.
echo $_POST['name'];
}
?>
Nota:
Utilizar una clave global
fuera de una función no es un
error. Esta puede ser utilizada aún si el fichero está incluido desde el interior de una función.
Uso de variables static
Otra característica importante del ámbito de las variables es la variable
estática. Una variable estática existe sólo en el
ámbito local de la función, pero no pierde su valor cuando la ejecución
del programa abandona este ámbito. Consideremos el siguiente ejemplo:
Ejemplo #4 Ejemplo que demuestra la necesidad de variables
estáticas
<?php
function test()
{
$a = 0;
echo $a;
$a++;
}
?>
Esta función tiene poca utilidad ya que cada vez que es llamada asigna a
$a el valor 0
e imprime un
0
. La sentencia $a++, que incrementa la
variable, no sirve para nada, ya que en cuanto la función finaliza, la
variable $a desaparece. Para hacer una función útil
para contar, que no pierda la pista del valor actual del conteo, la
variable $a debe declararse como estática:
Ejemplo #5 Ejemplo del uso de variables estáticas
<?php
function test()
{
static $a = 0;
echo $a;
$a++;
}
?>
Ahora, $a se inicializa únicamente en la primera
llamada a la función, y cada vez que la función test()
es llamada,
imprimirá el valor de $a y lo incrementa.
Las variables estáticas también proporcionan una forma de manejar
funciones recursivas. Una función recursiva es la que se llama a sí
misma. Se debe tener cuidado al escribir una función recursiva, ya que
puede ocurrir que se llame a sí misma indefinidamente. Hay que
asegurarse de implementar una forma adecuada de terminar la recursión.
La siguiente función cuenta recursivamente hasta 10, usando la variable
estática $count para saber cuándo parar:
Ejemplo #6 Variables estáticas con funciones recursivas
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>
Nota:
Las variables estáticas pueden ser declaradas como se ha visto en los ejemplos anteriores.
Desde PHP 5.6 se pueden asignar valores a estas variables que sean el resultado de
expresiones, aunque no se pueden usar funciones aquí, lo cual causaría un eror de análisis.
Ejemplo #7 Declaración de variables estáticas
<?php
function foo(){
static $int = 0; // correcto
static $int = 1+2; // correcto (a partir de PHP 5.6)
static $int = sqrt(121); // incorrecto (ya que es una función)
$int++;
echo $int;
}
?>
Nota:
Las declaraciones estáticas son resueltas en tiempo de compilación.
Referencias con variables global
y static
El motor Zend 1, utilizado por PHP 4, implementa los modificadores
static y global para variables
en términos de referencias.
Por ejemplo, una variable global verdadera importada dentro del ámbito
de una función con global
crea una referencia a la
variable global. Esto puede ser causa de un comportamiento inesperado,
tal y como podemos comprobar en el siguiente ejemplo:
El resultado del ejemplo sería:
NULL
object(stdClass)(0) {
}
Un comportamiento similar se aplica a static
. Las
referencias no son almacenadas estáticamente.
El resultado del ejemplo sería:
Objeto estático: NULL
Objeto estático: NULL
Objeto estático: NULL
Objeto estático: object(stdClass)(1) {
["property"]=>
int(1)
}
Este ejemplo demuestra que al asignar una referencia a una variable
estática, esta no es recordada cuando se invoca la
funcion &obtener_instancia_ref()
por segunda vez.