Variáveis variáveis em PHP

Publicado por Marcelino Janing em 20/11/2008

[ Hits: 25.962 ]

 


Variáveis variáveis em PHP



Um poderoso recurso disponibilizado pelo PHP é o uso de variáveis dinâmicas, ou seja, é possível utilizar o conteúdo de uma variável para alcançar o conteúdo de uma outra variável. Ficou difícil? Mas é muito mais fácil do que parece...

Toda variável em PHP é precedida de um cifrão ($varnormal), e uma variável dinâmica em PHP é precedida de dois cifrões ou mais de dois cifrões ($$vardinamica).

Fazendo um comparativo, esta funcionalidade do PHP é similar a macro substituição do CLIPPER onde um AMPERSAND (&vardinamica) é utilizado com o mesmo propósito. Entretanto, PHP vai um pouco mais além do que conhecíamos em CLIPPER.

Exemplificando em PHP:

<?php
// Criando uma variável normal em PHP
$varnormal = "Esta é uma variável normal que armazena um conteúdo";

// Criando uma outra variável normal, mas agora o conteúdo será a string "varnormal" que é o nome da nossa outra variável.
$vardinamica = "varnormal";

// Acessando as variáveis normalmente
echo '<hr>' . $varnormal; // Imprime "Esta é uma variável normal que armazena um conteúdo"
echo '<hr>' . $vardinamica; // Imprime "varnormal"

// Agora a mágica do PHP, acessando a variável $varnormal dinamicamente através do conteúdo de $vardinamica
echo '<hr>' . $$vardinamica; // Imprime "Esta é uma variável normal que armazena um conteúdo"

// Entenda que $vardinamica contém a string "varnormal"
// E o segundo cifrão faz a mágica acessando o conteúdo do conteúdo com variável $varnormal
// Talvez esta sintaxe com a variável protegida por CURLY BRACKETS (Chaves) seja mais fácil de compreender.
echo '<hr>' . ${$vardinamica}; // Imprime "Esta é uma variável normal que armazena um conteúdo"

// Um processo de decomposição de variáveis acontece no PHP, veja o exemplo abaixo:
$a = "b";
$b = "c";
$c = "a";

echo "<hr>" . $$$$$a; // Imprime "c"

// Explanando a decomposição das variáveis:
// $a contém "b", e restam $$$$
// $$a contém "b" que contém "c", e restam $$$
// $$$a contém "b" que contém "c" que contém "a", e restam $$
// $$$$a contém "b" que contém "c" que contém "a" que contém "b", e resta $
// $$$$$a contem "b" que contém "c" que contém "a" que contém "b" que contém "c"

// Pronto, está explicado como o PHP chegou ao conteúdo string "c", simplesmente decompondo-se os diversos cifrões.
echo "<hr>";

?>

Entenda que uma variável dinâmica, ou variável variável como diz a documentação em php.net, é um atalho para uma outra variável. Não confunda esta técnica com o acesso a variáveis por referência, onde uma variável pode ser ponteirada para o conteúdo de uma outra variável onde um AMPERSAND (&) é utilizado como notação em PHP.

Variáveis variáveis e variáveis por referência são duas técnicas distintas, e cada uma têm a sua razão e finalidade própria.

Fontes:
Última dica: é possível obter o mesmo efeito de variáveis variáveis em JavaScript utilizando-se a função eval().

Confiram meus próximos artigos e dicas.

Até a próxima.

Outras dicas deste autor

Desfazendo o dual boot

Variáveis variáveis em JavaScript

Leitura recomendada

Lista de discussão de desenvolvedores PHP de Minas Gerais

Classe para validação de formulários em PHP

Servidor web PHP completo

Enviar aspas em PHP de maneira menos suja

10 dicas de otimização em programação PHP

  

Comentários
[1] Comentário enviado por everton3x em 05/05/2009 - 16:10h

Uma utilidade para isso é:
foreach($_POST as $name => $value){
$$name = $value;
}

[2] Comentário enviado por mjaning em 08/05/2009 - 14:43h

Na programação orientada a objetos (OOP) também podemos usar o recurso re variáveis dinâmicas para instanciar propriedades dinâmicas dentro de um objeto.

Class X {
public $varstatic = 0; // propriedade estática.

public function __construct($varname,$varvalue) {
// setando uma propriedade dinamincamente
$this->$varname = $varvalue;

// setando uma proriedade estática
$this->varstatic = $varvalue;
}
}

// Criando instância para classe X com parâmetros para o construct
$teste = new X('vardynamic','conteúdo qualquer');

// imprimindo a propriedade staticamente definida
print 'varstatic = ' . $teste->varstatic;
print '<br />';
// imprimindo a propriedade dinamicamente definida
print 'vardynamic = ' . $teste->vardynamic;







Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts