Monday, June 22, 2009

Peculiaridade perturbadora do PHP

Há algum tempo comecei a usar os operadores "and" e "or" ao invés dos velhos "&&" e "||", pois acho mais agradável. Porém descobri uma coisa perturbadora (como muita coisa no PHP aliás), existe diferença entre eles.

O && e || tem precedência maior que and e or, o que quer dizer que nem sempre eles vão funcionar do mesmo jeito. Por exemplo:

if ( true or false )

é idêntico a

if ( true || false )

porém, vejam o que acontece abaixo:

$deveria_ser_true = false or true;
$deveria_ser_false = true and false;
echo $deveria_ser_false ? 'true' : 'false';
echo $deveria_ser_true ? 'true' : 'false';

as variáveis ficam com exatamente o contrário do valor que deveriam receber!!

Por que isso acontece? Temos que pensar na operação "=" como qualquer outra operação. Então, quando o PHP se depara com

$x = false || true;

ele tem que decidir qual vai ser executada primeiro. Como "||" tem prioridade (ou precedência) menor que "=", então ele executa assim:
$x = (false || true);

Porém no caso

$x = false or true;

o "or" tem prioridade (ou precedência) menor que "=", então fica

($x = false ) or true;

ou seja, atribui o valor "false" para $x e depois faz o "and" do valor da variável X com "true" e isso vai... bem, para lugar nenhum!

o programa abaixo exemplifica o problema. troquem o "or" por "||" para ver o que acontece.

echo ( $x = false or true ) ? 'true' : 'false';
echo "\n";
echo $x ? 'true' : 'false';
?>

Conclusão: é mais seguro utilizar os feios "||" "&&", e quem no inferno toma as decisões sobre a gramática do PHP??

Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?