A ver si me animo a participar:
Por qué?
Porque en una comparación de ese tipo entre un entero y un string php convierte (o intenta convertir) el tipo del string (internamente, es decir, sólo durante la comparación) en entero. La conversión la realiza de una manera parecida a la que en javascript lo hace parseInt, es decir, si empieza con un número, asumirá ese número; si empieza con letra será 0 (en javascript sería NaN).
Cómo solucionarlo?
Hay otras maneras redundantes, pero la más sencilla es hacer una comparación de identidad, usando el operador === en lugar de ==