Variáveis variáveis em PHP

Publicado por Marcelino Janing em 20/11/2008

[ Hits: 22.534 ]

 


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

Variáveis variáveis em JavaScript

Desfazendo o dual boot

Leitura recomendada

Váriaveis globais no PHP

PHP + Shell script

Escovando bits em PHP: operações bitwise e uma função debug

Driblando o REGISTER GLOBALS OFF

Nasce site sobre Zend Framework

  

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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts