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.
Chaves também podem ser utilizadas 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 {
public $bar = 'Eu sou bar.';
public $arr = ['Eu sou A.', 'Eu sou B.', 'Eu sou C.'];
public $r = 'Eu sou r.';
}
$foo = new Foo();
$bar = 'bar';
$baz = ['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";
?>
O exemplo acima produzirá:
Eu sou bar.
Eu sou bar.
Eu sou bar.
Eu sou r.
Eu sou B.
Aviso
Observe 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.