Variables variables PHP

Ofrecemos el significado y uso de variables variables en el lenguaje de programación PHP.
Escribo esta ayuda técnica sobre "variables variables" porque me parece un tema de no muy fácil comprensión pero de gran ayuda en cuanto a desarrollo con PHP, espero que a todos pueda ayudarnos a comprender un poco mejor si utilizo algún ejemplo práctico que en algunos momentos me ha ayudado a resolver ciertos problemas.

La explicación más sencilla y fácil de comprender se me ocurre sea la traducción al castellano de php.net, así que la pondré tal cual y después aplicaré la práctica procurando expresarme mas claramente.

############# Aquí comienza la explicación del sitio #######

A veces es conveniente tener nombres de variables variables. Dicho de otro modo, son nombres de variables que se pueden establecer y usar dinámicamente. Una variable normal se establece con una sentencia como:

<?php
$a = "hello";
?>


Una variable variable toma el valor de una variable y lo trata como el nombre de una variable. En el ejemplo anterior, hello, se puede usar como el nombre de una variable utilizando dos signos de dolar. p.ej.

<?php
$$a = "world";
?>


En este momento se han definido y almacenado dos variables en el árbol de símbolos de PHP: $a, que contiene "hello", y $hello, que contiene "world". Es más, esta sentencia:

<?php
echo "$a ${$a}";
?>


produce el mismo resultado que:

<?php
echo "$a $hello";
?>


Ambas producen el resultado: hello world.

############ Y aquí termina la explicación #############

El URL es http://mx.php.net/manual/es/language.variables.variable.php

Según creo, si hemos tenido algún contacto con la programación, habremos comprendido bastante bien la explicación, pero ¿ y como nos puede llegar a servir? ¿ en que ocasiones me puede ayudar?. Pues en particular lo he contemplado en situaciones donde en un archivo tengo que poner varios checkbox o radio buttons y en el siguiente tengo que examinar una a una esas variables; y como no deseo realizarlo de esta forma, los termino metiendo en un for, pero si he metido los nombres de los checkbox de la siguiente manera...

<form name='form1' method='post' action='guarda_preferencias.php'>
<table width='700' border='0'>
<tr>
<td><span class='style4'>Para Empezar </span></td>
</tr>
<tr>
<td><blockquote class='style5'><strong>
<input type='checkbox' name='pref_1' value='bienvenida'>
     Bienvenida</strong></blockquote></td> </tr>
<tr>
<td><blockquote class='style5'><strong>
<input type='checkbox' name='pref_2' value='temario'>
     Temario </strong></blockquote></td>
</tr>


y así sucesivamente hasta pref_n; en mi archivo guarda_preferencias.php, después del for que empezaría la revisión de la transferencia de cada checkbox, existiría el ligero inconveniente de tener que revisar $pref_$i, lo cual es un tremendo problema porque $pref_ no existe. Lo anterior yo lo he resuelto de la siguiente manera: hago uso de variables variables que me permitirán obtener el valor que realmente quiero, que es pref_1, pref_2....pref_n .

<?
for ($i=1;$i<=n;$i++){ //n es por supuesto el total de elementos checkbox
que hayamos creado
$nombre = "pref_$i";
$prefer = $$nombre;
if ($prefer != "") print "$nombre si trae algo, que es $prefer";
?>


Con lo cual $nombre hago que sea pref_ más el valor de $i, que irá aumentado de uno en uno cada vez que entre al for, y despues $prefer me dará el valor real de pref_1, pref_2, pref_3 y así hasta n, pudiendo yo evaluar cada checkbox uno a uno sin problemas, en este caso yo solo estoy evaluando que no esté vacío e imprimo el nombre y el valor.

Espero que haya quedado un poquito mas claro para todos, saludos!!

Compartir

Comentarios

una opción más

07/3/2004
creo que tal vez es un poco mas eficaz nombrar el checkbox o cualquier otro campo que vaya a ser consecutivo de una serie de campos de la siguiente manera:
<input type="checkbox" value="valor" name="caja[]">
con lo que al enviarse se recibe en php
foreach($_POST['caja'] as cajita)

asi puedes recorres el array caja recibido por post uno a uno, sin siquiera tener necesidad de saber el número de campos.

saludos

Roberto Bárcenas

16/3/2005
Bien, por supuesto existen varias alternativas al caso, de hecho, haciendo uso de variables autoglobales como $_POST o $_GET no es necesario recurrir a las variables variables muchas de las veces $_POST["pref_$i"] y nada mas.

La solución de guardar los checkbox en un arreglo y después pasarlo por un foreach tambien es interesante.
Por otra parte, yo he probado el código en navegadores diferentes sobre plataformas diferentes y no existe problema.
Saludos a todos!

rbk

17/3/2009
Hooolaaa... muuuchas gracias, casualmente estaba consultando sobre eso y tu articulo me cayo como anillo al dedo..Felicito aquellas personas que al igual que tu, se dedican a plantear soluciones a problemas comunes y quizas no tan comunes, De verdad que brindan un gran aporte al mundo de la programacion... Felicidades!!!

Diernan

16/12/2009
Objetos
Hola Roberto, muy bueno el articulo. La pregunta es, ¿porque no funcion esto?
$_tabla=$tablas[0]; //viene de un query que devuelve todas las tablas de un bd
$$_tabla=new Tabla(); //clase que tiene argumentos: array id, nombre, cantidad_id

Avc

08/4/2010
Que tipo de variables no se puede utilizar en Php
Alguien me podria explicar que tipo de variables son las que no se pueden utilizar en Php?
Cuantas son y cuales son?
Agredecere mucho, se sirvan ayudarme.
Gracias

Juan Ardissone

15/7/2010
Muy buen ejemplo
Gracias Roberto el artículo ayuda bastante para entender el uso. No encontraba un ejemplo práctico. Con eso veo que se puede reemplazar la misma funcionalidad de eval() y ya me queda claro el tema de variables variables.

Un abrazo.

daep996

05/1/2014
Gracias, un ejemplo practico a las variables variables
Muchas gracias, entendía el concepto, pero no concebía un ejemplo practico con el que usarlo o aplicarlo, gracias de nuevo!

vamaya

16/6/2014
probelmas con variables.
no encuentro el error que me presenta en las variables.
Notice: Undefined index: decreto in C:wampwwwPruebas_DBcontrollerprocesaCaptura.php on line 24
Call Stack
# Time Memory Function Location
1 0.0004 709648 {main}( ) ..procesaCaptura.php:0

( ! ) Notice: Undefined index: otros in C:wampwwwPruebas_DBcontrollerprocesaCaptura.php on line 25
Call Stack
# Time Memory Function Location
1 0.0004 709648 {main}( ) ..procesaCaptura.php:0

lo he buscado y no se donde esta, por favor me pueden ayudar......gracias...