Сравнение null и false в языке PHP
Различия null и false и выбор подходящего подхода
Как точно отличить null от false в PHP и избежать неоднозначности?
Самый надёжный способ - строгое сравнение (===). Оно проверяет и значение, и тип. null и false - разные типы (null и boolean), поэтому строгое равенство всегда возвращает false.
$var1 = null;
$var2 = false;
if ($var1 === $var2) {
echo "Равны";
} else {
echo "Не равны"; // Выведется
}
Php форматы данных (форматы данных в php (json, xml, serialize))
Не равны
Php null false (null и false в php)
Типичная ошибка:
Использование == (нестрогое сравнение) приводит к путанице: null == false возвращает true, хотя типы разные.
var_dump(null == false); // bool(true)
Php get started (начало работы с php)
Из-за этого в условиях if($value) невозможно понять, было ли значение null или false. Рекомендуется всегда применять === для проверки.
Как проверить, что переменная равна именно null, а не false?
Функция is_null() однозначно определяет null. Для boolean используйте is_bool().
$value = null;
var_dump(is_null($value)); // true
var_dump(is_bool($value)); // false
Custom index php (создание собственного index.php)
Ошибка: is_null() возвращает true для несуществующих переменных (если включены предупреждения). Лучше предварительно проверить isset().
Как интерпретировать null и false в логических контекстах?
Оба значения в if() преобразуются к false. Для разделения нужно явно проверять тип.
function test($var) {
if ($var === null) {
echo 'null';
} elseif ($var === false) {
echo 'false';
} else {
echo 'другое';
}
}
Php структура данных (изучение структур данных в php)
Частая проблема: пустая строка '' при == равна false и null. Строгое сравнение решает всё.
Как использовать empty() для проверки на null и false одновременно?
empty() считает false, null, 0, '' и т.д. «пустыми». Если нужно охватить все ложные значения - это вариант, но он стирает различия.
$val = null;
var_dump(empty($val)); // true
$val = false;
var_dump(empty($val)); // true
Php добавить переменную (добавление переменной php)
Недостаток: empty() не различает причины «пустоты». Для точной диагностики используйте is_null() или is_bool().
Как привести значение к булеву типу и сохранить null?
Приведение (bool) делает null -> false, а false остаётся false. Потеря информации неизбежна. Альтернатива - сохранять исходное значение и проверять отдельно.
$v = null;
$b = (bool) $v;
var_dump($b); // bool(false)
Не рекомендуется, если нужно отличать неопределённость (null) от логического «нет».
Расширенные примеры работы с null и false
Сравнение с помощью switch
$val = null;
switch (true) {
case $val === null:
echo 'null';
break;
case $val === false:
echo 'false';
break;
default:
echo 'другое';
}
null
Используется строгое сравнение внутри switch - это надёжно.
Возврат значений функций: null как сигнал об отсутствии данных
function findUser($id) {
// Если пользователь не найден, возвращаем null
// Если найдено, но статус неактивен, можно вернуть false
if ($id <= 0) return null;
// ...
return ['status' => true];
}
Путаница: если функция может вернуть null, false, или массив - на вызывающей стороне нужно строго проверять тип. Иначе массив, где элемент status = false, будет неотличим от отсутствия данных.
Различия в json_encode
$data = ['a' => null, 'b' => false];
echo json_encode($data);
{"a":null,"b":false}
В JSON null и false представлены разными литералами. При декодировании типы сохраняются.
Трюк с массивами array_search
$arr = [0 => 'a', 1 => null, 2 => false];
$key = array_search(null, $arr, true); // строгий поиск
var_dump($key); // int(1)
$key2 = array_search(false, $arr, true);
var_dump($key2); // int(2)
Строгий поиск (третий параметр true) корректно разделяет null и false.
Влияние на оператор?? (null coalescing)
$v = false;
$result = $v ?? 'default';
echo $result; // false, потому что ?? проверяет только null
Оператор ?? не считает false неопределённым. Если нужно подменить и false - используйте $v ?: 'default' (тернарный с приведением).
Сравнение с помощью is_null и is_bool
$values = [null, false, 0, ''];
foreach ($values as $v) {
if (is_null($v)) echo "null\n";
elseif (is_bool($v)) echo "bool\n";
else echo "другое\n";
}
null bool другое dругое
Такой подход не полагается на неявные преобразования.