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:
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:
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:
produz a mesma saída que:
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).
Exemplo #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.
Aviso
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.