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 incluidos y los
requeridos. Por ejemplo:
AquÃ, la variable $a dentro del script
incluido b.inc. De todas formas, dentro de las funciones
definidas por el usuario aparece un ámbito local a la
función. Cualquier variables que se use dentro de una
función está, por defecto, limitada al ámbito
local de la función. Por ejemplo:
Este script no producirá salida, ya que la orden 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. Veamos un
ejemplo:
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 la matriz
$GLOBALS. El ejemplo anterior se puede
reescribir asÃ:
La matriz $GLOBALS es una matriz asociativa con
el nombre de la variable global como clave y los contenidos de
dicha variable como el valor del elemento de la
matriz. $GLOBALS existe en cualquier ámbito,
esto pasa porque $GLOBALS es una superglobal. Aqui
teneis un ejemplo que demuestra el poder de las superglobales:
Otra caracterÃstica importante del ámbito de las
variables es la variable static. 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:
Esta función tiene poca utilidad ya que cada vez que es
llamada asigna a $a el valor
0 y representa un "0". La sentencia
$a++, que incrementa la variable, no sirve para
nada, ya que en cuanto la función termina 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:
Ahora, cada vez que se llame a la función Test(), se
representará el valor de $a y se
incrementará.
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:
En motor Zend 1, utilizado por PHP4, 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:
Al ejecutar este ejemplo obtendremos la siguiente salida:
NULL
object(stdClass)(0) {
} |
Un comportamiento similar se aplica a
static. Referencias no son guardadas
estáticamente.
Al ejecutar este ejemplo obtendremos la siguiente salida:
Static object: NULL
Static object: NULL
Static object: NULL
Static object: 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 &get_instance_ref() por
segunda vez.