Ambito 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 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_