Variáveis variáveis

As vezes, é conveniente possuir nome variáveis para variáveis. Isto é, o nome de uma variável que pode ser definido e utilizado dinamicamente. Uma variável normal é definida com uma instrução como:

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

Uma variável variável obtém o valor de uma variável e a trata como o nome de uma variável. No exemplo acima, hello pode ser utilizado como o nome de uma variável utilizando dois sinais de cifrão:

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

Neste ponto, duas variáveis foram definidas e armazenadas na árvore de símbolos do PHP: $a que contém "hello" e $hello que contém "world". Assim, esta instrução:

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

produz a mesma saída que:

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

assim sendo, as duas produzem: hello world.

Para poder utilizar variáveis variáveis com arrays, é necessário resolver um problema de ambiguidade. Isso é, se for escrito $$a[1], o interpretador precisa saber se a intenção é utilizar $a[1] como uma variável ou se a intenção é usar $$a como uma variável e [1] como o índice dessa variável. A sintaxe para resolver essa ambiguidade é ${$a[1]} para o primeiro caso e ${$a}[1] para o segundo.

Propriedades de classes também podem ser acessadas utilizando-se nomes de propriedades variáveis. O nome de propriedade variável será resolvido dentro do escopo em que a chamada foi feita. Por exemplo, se houver uma expressão como $foo->$bar, o escopo local será examinado procurando por $bar e seu valor será utilizado como o nome da propriedade $foo. Isso também funciona se $bar for um array.

Colchetes também podem ser utilizados para delimitar claramente os nomes de propriedade. São muito úteis ao acessar valores de uma propriedade que contenham um array, quando o nome da propriedade tem várias partes, ou quando o nome da propriedade contém caracteres que não são válidos (por exemplo, em saídas da função json_decode() ou SimpleXML).

Example #1 Exemplo de propriedade variável

<?php
class foo {
    var $bar = 'I am bar.';
    var $arr = array('I am A.', 'I am B.', 'I am C.');
    var $r   = 'I am 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";

?>

O exemplo acima produzirá:


I am bar.
I am bar.
I am bar.
I am r.
Warning

Note que variáveis variáveis não podem ser utilizadas nos arrays superglobais dentro de funções ou métodos de classe. A variável $this também é uma variável especial que não pode ser referenciada dinamicamente.