Variables Predefinidas
Variables variables
Variables
PHP Manual

## Á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:

`<?php
$a = 1;
include 'b.inc';
?>`

Aquí, la variable $a estará disponible al interior del script incluído 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:

`<?php
$a = 1; /* ámbito global */
function test()
{
echo $a; /* referencia a una variable del ámbito local */
}
test();
?>`

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:

Example #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 la matriz $GLOBALS. El ejemplo anterior se puede reescribir así:

Example #2 Uso de $GLOBALS en lugar de global

`<?php
$a = 1;
$b = 2;
function Suma()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Suma();
echo $b;
?>`

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 ocurre ya que $GLOBALS es una superglobal. Aquí hay un ejemplo que demuestra el poder de las superglobales:

Example #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'];
}
?>`

### 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:

Example #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:

Example #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 $conteo para saber cuándo parar:

Example #6 Variables estáticas con funciones recursivas

`<?php
function test()
{
static $conteo = 0;
$conteo++;
echo $conteo;
if ($conteo < 10) {
test();
}
$conteo--;
}
?>`

> Note: Las variables estáticas pueden ser declarados 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.

> Example #7 Declaración de variables estáticas

> `<?php
> function 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;
> }
> ?>`

### 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:

`<?php
function 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);
?>`

Al ejecutar este ejemplo obtendremos la siguiente salida:

NULL
object(stdClass)(0) {
}

Un comportamiento similar se aplica a static. Las referencias no son almacenadas estáticamente.

`<?php
function &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();
?>`

Al ejecutar este ejemplo obtendremos la siguiente salida:

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.

Variables Predefinidas
Variables variables
Variables
PHP Manual