Variables variables
A veces es conveniente tener nombres de variables variables. Dicho de
otro modo, son nombres de variables que se pueden definir y usar
dinámicamente. Una variable normal se establece con una sentencia como:
Una variable variable toma el valor de una variable y lo trata como el
nombre de una variable. En el ejemplo anterior,
hola, se puede usar como el nombre de una variable
utilizando dos signos de dólar. Es decir:
En este momento se han definido y almacenado dos variables en el árbol de
símbolos de PHP: $a, que contiene "hola", y
$hola, que contiene "mundo". Es más, esta
sentencia:
produce el mismo resultado que:
esto quiere decir que ambas producen el resultado: hola mundo.
Para usar variables variables con arrays hay que
resolver un problema de ambigüedad. Si se escribe
$$a[1], el intérprete necesita saber si nos
referimos a utilizar $a[1] como una variable, o si
se pretendía utilizar $$a como variable y el índice [1]
como índice de dicha variable. La sintaxis para resolver esta ambigüedad
es: ${$a[1]} para el primer caso y
${$a}[1] para el segundo.
También se puede acceder a las propiedades de una clase usando el nombre de propiedad variable.
Este será resuelto dentro del ámbito del cual se hizo
la llamada. Por ejemplo, en la expresión
$foo->$bar, se buscará $bar en el ámibto
local y se empleará su valor será como el nombre de la propiedad
de $foo. Esto también es cierto
si $bar es un acceso a un array.
Precaución
Además, derreferenciar una propiedad variable que es un array tiene diferente
semántica entre PHP 5 y PHP 7. La
guías de migración de PHP 7.0
incluye más detalles sobre los tipos de expresiones que han cambiado,
y cómo colocar llaves para evitar ambigüedades.
También se pueden usar llaves para delimitar de forma clara el nombre de la
propiedad. Son muy útila al acceder a valores dentro una propiedad que
contiene un array, cuando el nombre de la propiedad está compuesto de múltiples partes,
o cuando el nombre de la propiedad contiene caracteres que de otro modo no son
válidos (p.ej. desde json_decode()
o SimpleXML).
Ejemplo #1 Ejemplo de propiedad variable
<?php
class foo {
var $bar = 'Soy bar.';
var $arr = array('Soy A.', 'Soy B.', 'Soy C.');
var $r = 'Soy r.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->{$baz[1]} . "\n";
$start = 'b';
$end = 'ar';
echo $foo->{$start . $end} . "\n";
$arr = 'arr';
echo $foo->$arr[1] . "\n";
echo $foo->{$arr[1]} . "\n";
?>
El resultado del ejemplo sería:
Soy bar.
Soy bar.
Soy bar.
Soy r.
Advertencia
Por favor tenga en cuenta que las variables variables no pueden usarse
con los Arrays
superglobales de PHP al interior de funciones o métodos de
clase. La variable $this
es también una variable
especial que no puede ser referenciada dinámicamente.