El ámbito de la variable es el contexto en el que se puede acceder a una variable. En PHP podemos tener variables locales y globales. Cuando una variable se define dentro de una función es, de manera predeterminada, una variable local, es decir, no es accesible desde fuera de la función. Si la variable se define fuera de la función su ámbito es global y tenemos la posibilidad de poder utilizarla dentro de las funciones.
Pero estamos hablando de funciones cuando aún no hemos definido qué es una función y para qué sirve. Aunque luego lo veremos con detalle, podemos adelantar que se apela al uso de una función cuando existe una parte de un programa que se utiliza repetidamente. Esa sección de código se encierra en lo que se denomina una función lo que facilita el seguimiento y la depuración de los programas.
Una función puede acceder a una variable definida en la parte principal del programa. Existen varias formas de poder hacerlo:
- Definición de global: Aunque parezca redundante, PHP nos obliga a definir explícitamente dentro de la función a las variables globales para poder usarlas dentro de la función.
- Uso de la matriz $GLOBALS: Si queremos evitar la definición global podemos utilizar la matriz asociativa que posee todas las variables globales. $GLOBALS es una superglobal.
Superglobal: es un conjunto de variables que son globales de modo automático, no hace falta definirlas como global dentro de una función. |
En el siguiente código se muestra una variable $var definida en el programa principal y tres funciones. En la primera al hacer referencia a la variable $var sin usar global ni $GLOBALS lo que sucede es que se utiliza una variable local, es decir, una variable interna a la función. Las otras dos funciones muestran dos maneras distintas de hacer lo mismo para usar en una función una variable definida fuera de ella.
<?php // Globales (ejemplo file006.php) function PruebaSinGlobal() { $var++; echo "Prueba sin global. \$var :". $var . "<BR>"; /* ¿qué valor muestra $var? */ // al no haber definición global y no usar // $GLOBALS, $var se trata como una variable local // por eso imprime 1 en lugar de 21 } function PruebaConGlobal() { global $var; $var++; echo "Prueba con global. \$var :". $var . "<BR>"; /* ¿qué valor muestra $var? */ // $var ya no es local, se trata como global // imprime 21 } function PruebaConGlobals() { $GLOBALS["var"]++; echo "Prueba Con GLOBALS. \$var :". $GLOBALS["var"] . "<BR>"; /* ¿qué valor muestra $var? */ // $var ya no es local, se trata como global // imprime 22 } $var = 20; /* variable global */ PruebaSinGlobal(); PruebaConGlobal(); PruebaConGlobals(); ?>
El mal uso del ámbito de las variables es uno de los errores más comunes en los programadores principiantes. |
Ámbito de variables y HTML
¿Qué sucede con el ámbito de las variables cuando el código PHP se entremezcla con código HTML?
Por ejemplo, ¿que imprimirá la sentencia print en este ejemplo?:
<HTML><HEAD> <?php $var = "Test"; ?> </HEAD> <BODY> <?php print("$var"); ?> </BODY> </HTML>
La respuesta correcta es "Test", dado que las variables mantienen su ámbito aunque el código HTML interrumpa la secuencia del código PHP. Lo importante es únicamente la secuencia del código PHP.
Variables estáticas
Una característica interesante para las variables locales de una función es su definición como estática. En el siguiente ejemplo la función PruebaLocal utiliza la variable local $var. Cada vez que se llama a la función PruebaLocal la variable $var se define con el valor cero y el incremento que se hace dentro de la función (++$var) no se mantiene en las siguientes llamadas.
<?php // Ámbito local (ejemplo file007.php) function PruebaLocal() { $var; echo "Prueba local. \$var :". ++$var . "<BR>"; /* ¿qué valor muestra $var? */ } PruebaLocal(); // debe imprimir 1 // la suma ++$var se pierde porque es una variable local // que se reinicializa en cada llamada a la función PruebaLocal(); // debe imprimir 1 // siempre imprimirá 1 PruebaLocal(); // debe imprimir 1 ?>
Si queremos mantener el valor de una variable en las sucesivas llamadas a la función debemos definir a la variable como estática (static).
<?php // Ámbito local (ejemplo file008.php) function PruebaLocal() { // se define la variable como estática para // que la variable mantenga su valor entre // las diferentes llamadas a la función static $var; echo "Prueba local. \$var :". ++$var . "<BR>"; /* ¿qué valor muestra $var? */ } PruebaLocal(); // debe imprimir 1 PruebaLocal(); // deberá imprimir 2 PruebaLocal(); // deberá imprimir 3 ?>