Сравнение null и false в языке PHP

Раздел: Программирование на PHP -> Основы 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) от логического «нет».

- File php query (запрос к файлу в php)
- File c index php (файл index.php в php)
- Php название файла (правила именования файлов в php)

Расширенные примеры работы с 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ругое

Такой подход не полагается на неявные преобразования.

null и false в PHP - comments

En
Php null false (php)