Claro, el ! es un not, negación pues.
El asunto es que tu condición es ambigua, pues el ! cancela el valor de la variable que le sigue y por ende no se compara como tienes en mente.
Así que en teoría parece como si se ejecutara así:
Para evitar la ambigüedad puedes agrupar la comparación entre paréntesis.
Código PHP:
Ver original// MAL
if ( ! $foo == $bar)
// BIEN
if ( ! ($foo == $bar))
Con lo cual estarías negando la expresión completa, tal cual debe ser.