Esto va dedicado a todos aquellos que siempre vuelven a preguntarme en qué pelotas trabajo. Aquí tenéis un ejemplo, espero que por fin quede claro:
El problema de los lenguajes no tipados es que te puedes encontrar con errores tan sutiles como este. Validando un precio (básicamente un número), el programa hacía lo siguiente:
“123″ => Correcto
“-123″ => ERROR!
“0″ => Correcto pero no se usa
“” => Correcto pero no se usa
“123asd” => ERROR!
“asd” => Correcto pero no se usa <<<<<<===== WTF!?!?!?!
Debería haberme escupido un error en el último caso!
Trazando el código me encuentro que se comprueba y pone a cero tal que así:
if (isset ($this->price) && $this->price == 0) $this->price = NULL;
Por qué entra en el if cuando “asd” es claramente diferente a 0?
Porque en PHP, al estar comparando una cadena con un entero, se intenta hacer una conversión emplícita a entero de la cadena y al no poder, queda el if tal que asina:
if (isset ($this->price) && NULL == 0) $this->price = NULL;
Y ese NULL==0 se evalúa a verdadero por las reglas de comparación de PHP.
Vamos que he estado dándole vueltas un rato a esto, para que ahora la solución se base en añadir un carácter convirtiendo la comparación de igualdad en una comparación de identidad:
- if (isset ($this->price) && ($this->price == 0 || $this->type != ‘s’)) $this->price = NULL;
+ if (isset ($this->price) && ($this->price === 0 || $this->type != ‘s’)) $this->price = NULL;

