Como agregado a lo dicho: Tengan en cuenta que existen dos operadores de comparación totalmente distintos que muchas veces son confundidos. El más usado, ==, que en términos simples significa comparación flexible, y === que significa comparación estricta. Hablando desde un punto de vista "flexible", la siguiente expresión es verdadera (de lo cuál se deduce que, para el operador ==, "" es igual a null):
"" == false == 0 == null
Efectivamente, usar empty() es diferente a usar esos operadores de comparación. Revisa
estas tablas y observa para qué tipo de expresiones empty() devuelve true.