Uma funcionalidade do PHP que eu gostaria que não existisse
É 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_qualquerreferencia 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.

September 29th, 2008 às 11:38 am
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…