A linguagem PHP* possui comportamentos que desafiam a lógica.

Recentemente, ministrando um curso de PHP, notei que os alunos ficaram surpresos com os “pegas” que aqui discutiremos.

Ao longo dos experimentos usamos o psysh, um REPL para PHP bastante útil para praticar aspectos técnicos da linguagem.

Variáveis de Variáveis

Ao trabalhar com PHP devemos ter em mente o que, exatamente, é uma variável.


>>> ${"teste"} = 4;
=> 4
>>> $teste
=> 4

No exemplo acima vemos que podemos manipular a tabela de símbolos de PHP diretamente. Então uma cadeia de carateres qualquer pode ser utilizada dentro de {}’s para criarmos um novo nome de variável. Eis o problema: uma cadeia de carateres qualquer, que não é verificada pelo parser da linguagem. Então podemos gerar nomes de variáveis ilegais por meio deste artifício.


>>> ${'$$$$'} = 4;
=> 4
>>> ${''} = 4;
=> 4
>>> ${"\b"} = 4;
=> 4

São todos exemplos de variáveis que serão bem difíceis (impossíveis) de dereferenciar usando a sintaxe $nome para a variável ${“nome”}. Caso o desenvolvedor esteja gerando nomes de variáveis a partir de uma fonte dinâmica, as variáveis acima podem ficar impossíveis de acessar. Em especial se forem encontrados quaisquer dos caracteres exemplificados(a string vazia, $’s, e backspace: \b) na string entre {}’s. Configuram, para todos os fins, memória perdida na tabela de símbolos.

Armadilhas nas Comparações

"" == 0
=> true

A comparação acima pode acontecer quando lemos campos NULL de bancos de dados. A string vazia, bem como o 0, quando tratados como booleanos, equivalem ao valor falso. Tratados como string e inteiro, respectivamente, o resultado não tem qualquer sentido. Porém o seguinte exemplo parece jogar um balde de água fria sobre a nossa explicação para o caso anterior:


>>> "" == 090098765
=> true

Não há hipótese alguma em que o inteiro 090098765 possa ser considerado um valor falso! Ou há? Na verdade, em PHP, há sim.

O inteiro iniciado pelo dígito zero encontra-se na base octal. Mas o dígito 9 não existe na base octal, logo a linguagem retorna um valor falso: o inteiro 0. Sim, o interpretador PHP acaba de transformar o número 090098765 em 0 sem avisar! É dessa fibra que são construídos os piores bugs de grandes sistemas feitos em PHP!

São apenas alguns exemplos de “pegas” da linguagem PHP que discutimos no recente curso, mas o leitor poderá encontrar incontáveis outros procurando por “PHP quirks” ou “PHP gotchas”. (Ou visitando o site PHPWTF.com!)

* Será que PHP7 mudará esta realidade?