ti-enxame.com

Conversão de tipo para booleano

Alguém pode me explicar por que isso:

var_dump((bool) 1==2);

retorna

bool(true)

mas

var_dump(1==2);

retorna

bool(false)

Claro que o segundo retorno está correto, mas por que, na primeira ocasião, o php retorna um valor inesperado?

45
Paris Liakos

Na verdade, não é tão estranho quanto parece. (bool) tem precedência mais alta que == , então isso:

var_dump((bool) 1==2);

é equivalente a isso:

var_dump(  ((bool) 1)   == 2);

ou isto:

var_dump(true == 2);

Devido a malabarismo do tipo , o 2 também é basicamente convertido em bool (como essa é uma "comparação livre"), portanto é equivalente a isso:

var_dump(true == true);

ou isto:

var_dump(true);
88
ruakh

Porque no primeiro exemplo, o elenco ocorre antes da comparação. Então é como se você escrevesse

((bool) 1)==2

que é equivalente a

true == 2

que é avaliado convertendo 2 para true e comparando, produzindo true.

Para ver o resultado esperado, você precisa adicionar parênteses para tornar o pedido explícito:

var_dump((bool)(1==2));

Veja em ação.

20
Jon

Eu uso desta maneira:

!!0 (false)
!!1 (true)
7
user2678106

A maneira como você escreveu a instrução ((bool) 1 == 2) sempre retornará true, porque sempre executará o código como abaixo do fluxo:

Primeiro, ele executará

(bool)1

e (bool) 1 retornará true.

Agora, como (bool) 1 é verdadeiro no segundo passo, sua declaração será como

true ==2

Como se transformarmos 2 em booleano, ele retornará verdadeiro, no estado final sua declaração será como

true == true

O que obviamente retornará verdadeiro. A mesma coisa que expliquei ano atrás no meu post conversão de tipo PHP também.

0
Ankur Kumar Singh