Ojo con las compararciones en PHP

En PHP hay que tener cuidado al comparar dos valores cuando uno de ellos es una cadena. Para ver el problema he creado la función «comparar» donde vemos si un valor es igual a cero o no:

function comparar($valor)
{
    echo  mensaje($valor) . " -> " . comparacion($valor) . PHP_EOL;
}

function mensaje($valor)
{
    return "$valor se convierte en " . (int) $valor . ", por lo tanto: ($valor == 0)";
}

function comparacion($valor)
{
    return $valor == 0 ? 'true' : 'false';
}

comparar(123);
comparar('123');
comparar('123Z');
comparar('Z123');

Los resultados serán:

123 se convierte en 123, por lo tanto: (123 == 0) -> false
 123 se convierte en 123, por lo tanto: (123 == 0) -> false
 123Z se convierte en 123, por lo tanto: (123Z == 0) -> false
 Z123 se convierte en 0, por lo tanto: (Z123 == 0) -> true

Los tres primeros devuelven false porque el valor se puede convertir en un número distinto de cero. En el último caso es una cadena no convertible en número, por lo tanto se convierte en un cero.

Me siento solo, dime algo...