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
<?phpfunction 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 estáticas
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
<?phpfunction 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
<?phpfunction 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
<?phpfunction 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. Al tratar de asignar valores a estas variables que sean el resultado de expresiones, causará un error de análisis sintáctico.Ejemplo #7 Declaración de variables estáticas
<?phpfunction foo(){
static $int = 0; // correcto
static $int = 1+2; // incorrecto (ya que es una expresión)
static $int = sqrt(121); // incorrecto (es una expresión también)
$int++;
echo $int;
}?>
Nota:
Las declaraciones estáticas son resueltas en tiempo de compilación.
Nota:
Utilizar una clave global fuera de una función no es un error. Esta pueda ser utilizada aún si el fichero está incluido en el interior de una función.
Referencias con variables globales y estáticas
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:
<?phpfunction prueba_referencia_global() {
global $obj;
$obj = &new stdclass;
}
function prueba_no_referencia_global() {
global $obj;
$obj = new stdclass;
}
prueba_referencia_global();var_dump($obj);prueba_no_referencia_global();var_dump($obj);?>
El resultado del ejemplo sería:
NULL
object(stdClass)(0) {
}
Un comportamiento similar se aplica a static. Las
referencias no son almacenadas estáticamente.
<?phpfunction &obtener_instancia_ref() {
static $obj;
echo 'Objeto estático: ';
var_dump($obj);
if (!isset($obj)) {
// Asignar una referencia a la variable estática
$obj = &new stdclass;
}
$obj->property++;
return $obj;
}
function &obtener_instancia_no_ref() {
static $obj;
echo 'Objeto estático: ';
var_dump($obj);
if (!isset($obj)) {
// Asignar el objeto a la variable estática
$obj = new stdclass;
}
$obj->property++;
return $obj;
}
$obj1 = obtener_instancia_ref();$aun_obj1 = obtener_instancia_ref();
echo "\n";$obj2 = obtener_instancia_no_ref();$aun_obj2 = obtener_instancia_no_ref();?>
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.
No hay comentarios:
Publicar un comentario