ноль работает, если переменная на самом деле NULL. Если переменная представляет собой пустую строку (""), ноль, ложь или пустой массив, is_null оценивается как ложное. Это несколько нелогично, поэтому я бы всегда предложил использовать empty ().
empty () возвращает true для 0, пустой строки, пустого массива, логического false или NULL. Так что попробуйте:
if(!empty($subcat)){ do something; }
Используйте is_null, только если вы на 100% уверены, что ТОЛЬКО хотите что-то сделать, если переменная равна NULL. Пусто обычно лучше проверить, собираетесь ли вы вызывать метод класса для чего-то неожиданного.
Edit: Да, иногда получение NULL из базы данных дает вам строку "NULL", которая не совпадает с фактическим значением NULL. Это зависит от того, какую базу данных вы используете, и от того, как вы сохранили значение в базе данных. Это очень легко пропустить и может потребоваться вечность, чтобы понять. Попробуйте использовать var_dump () для переменной subcat, чтобы увидеть, является ли она строкой "NULL" (4) или буквально значением NULL. Это может объяснить непредвиденное поведение в другом сегменте кода, который вы упомянули в комментариях.