Если вы проверите таблицу, вы заметите, что для всех случаев empty($x) совпадает с !$x. Таким образом, это сводится к обработке неинициализированных переменных. !$x создает E_NOTICE, тогда как empty($x) не делает.
Ответ 2
Если вы используете пустой, и переменная никогда не была установлена /создана, никакие предупреждения/ошибки не будут выбрасываться.
При преобразовании в логическое значение считаются значения FALSE:
сам boolean FALSE
целое число 0 (ноль)
float 0.0 (ноль)
пустая строка и строка "0"
массив с нулевыми элементами
объект с нулевыми переменными-членами (только для PHP 4)
специальный тип NULL (включая неустановленные переменные)
SimpleXML объекты, созданные из пустых тегов
Кажется, единственная разница (относительно результирующего значения) заключается в том, как обрабатывается экземпляр SimpleXML. Все остальное, похоже, дает тот же результат (если вы, конечно, инвертируете булевский листинг).