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.
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.