sábado, 23 de janeiro de 2010

O PHP e suas surpresas

Graças a um erro em uma função criada por mim, meu site estava com um bug constrangedor, pelo menos agora já está corrigido.

O problema da função que criei era que ela deveria retornar um array, mas, devido a um lapso momentâneo meu, ela estava retornando uma string. Acontece que o PHP considera uma string como um array de caracteres, mas até aí isso parece uma consideração bem lógica. Se você tem a varável $nome por exemplo, você pode acessar o primeiro caractere assim:

$nome = "Maria";
echo $nome[0]; // escreve M

Mas quando eu recebia o retorna da minha função eu não estava usando números inteiros como índice para acessar os valores do array (como usei o 0 no exemplo anterior). Eu usei strings como indices. Nestas horas que a tipagem fraca do PHP conjuntamente com uma inferência de tipos bem flexível mostra uma das desvantagens da plataforma (pelo menos para os mais desavisados como eu estava neste caso). O que você esperaria como saída no código abaixo:

$nome = "Maria";
echo $nome['valor']; //????

Bom, de acordo com a documentação do PHP, valores não inteiros usados como índice para strings são convertidos para inteiros. E o que o PHP faz quando tem que converter uma string como 'valor' (que não tem nada de número inteiro) para inteiro? Bem ele converte para 0 (zero). Silenciosamente ele converte um índice do tipo string para 0 do tipo inteiro. Assim o código assima exibe a mesma saída do código anterior a ele.

Isso não é um ataque ao PHP, o erro foi meu. Isso só serve para mostrar que você deve tomar bastante cuidado com estas conversões de tipo implícitas que o PHP faz.

Nenhum comentário:

Postar um comentário