Uma funcionalidade do PHP que eu gostaria que não existisse

Em: 29/09/2008 Tags: Referencie do seu blog (Trackback)

É o maldito $$!

Infelizmente há programadores que gostam dele, e usam como bengala para situações onde um simples array associativo daria conta do recado. Mas saiba que um dia (uma semana, um mês, um ano depois) alguém vai pegar esse código, e essa pessoa vai sofrer.

Se você não sabe o que é o $$, recomendo que continue lendo, pois um dia você pode precisar dar manutenção em um código desses. Se já sabe, por favor, deixe um comentário dando uma razão racional para utilizá-lo (e não “eu tenho preguiça de escrever arrays associativos”).

Para exemplificar o uso do $$, vamos considerar a idéia (insegura) de transformar todas as chaves do array superglobal $_GET em variáveis. O código é o seguinte:

foreach ($_GET as $key => $value) {
    $$key = $value;
}

Ok, você não entendeu o que está acontecendo. Imagine que o script que define esse código é o test.php, e que ele está hospedado em http://www.example.com/test.php. Vamos apontar nosso browser para esse script e passar 2 variáveis: color e height. A URL seria:

http://www.example.com/test.php?color=red&height=3

O que o loop foreach está fazendo? Para cada par chave/valor ($key/$value) do nosso array ($_GET), é definida uma variável cujo nome é igual à chave do array ($key), e seu valor é igual ao valor para o qual aquela chave do array aponta. Não entendeu nada ainda? Vamos de novo:

$$um_variavel_qualquer referencia uma variável cujo nome depende do valor presente na variável $uma_variavel_qualquer.

Outro exemplo:

$nome = 'Caio';
$$nome = 'Programador';
echo $Caio;

Esse programa dá como resultado:

Programador

Portanto, após a execução do foreach, as variáveis $color e $height estarão disponíveis. Isso pode parecer legal à primeira vista, mas não é. Fora as questões de insegurança que ela levanta (que você pode encontrar facilmente pelo Google), é complicada pegar um script não-MVC de, digamos, 500 linhas, que você não escreveu, e tentar entender quando a variável $um_nome_muito_maluco foi definida. Você vai subindo pelo script, chega ao topo e viu que na verdade ela não foi definida explicitamente, mas sim dentro de um loop foreach que utiliza o mágico $$. Você já terá perdido uns 10 minutos (sendo otimista) no momento em que se deu conta disso, e vai se lembrar deste post (eu espero).

Portanto, tenha piedade do programador que dará manutenção no seu código no futuro. Lembre-se de que esse programador pode ser você mesmo.

Artigos relacionados:

Uma resposta para “Uma funcionalidade do PHP que eu gostaria que não existisse”

  1. Dyego Souza do Carmo disse:

    Meu deus do ceu…. que XUNXO…

    estou pasmo até agora…. o que me revolta é o pessoal do PHP deixar um nojo desse entrar na linguagem… meu deus…

Escreva um comentário (utilize o formato Markdown)