Confusión tipo yeso de PHP

Tengo el siguiente código:

 

Siempre tuve la impresión de que $ res debería ser ‘falso’ ya que en la expresión anterior PHP trataría de escribir cast $ val en booleano tipo (donde cero se convertirá en falso) y una cadena (cadena no vacía es verdadera). Pero si ejecuto el código anterior, la salida será:

 boolean true 

¿Me estoy perdiendo de algo? Gracias.

En PHP, todas las cadenas no vacías y no numéricas se evalúan a cero, por lo que 0 == 'true' es VERDADERO, pero 0 === 'true' es FALSO. La cadena true no se ha convertido a un valor booleano, sino que se compara como una cadena al cero. El cero se deja como un valor int, en lugar de emitirse como un booleano. Entonces, en última instancia, obtienes:

 // string 'true' casts to int 0 0 == 0 // true 

Prueba esto:

 echo intval('true'); // 0 echo intval('some arbitrary non-numeric string'); // 0 

Revise la tabla de comparaciones de tipos de PHP . En general, al hacer comparaciones booleanas en PHP y los tipos no son lo mismo (int a la cadena en este caso), es valioso usar comparaciones estrictas.

Como $val es el primer operador, PHP convierte la cadena en true a un entero que se convierte en 0. Como resultado, 0 == 0 y su resultado es verdadero;

Prueba esto