Значение false в языке PHP: полный разбор

Раздел: Программирование на PHP -> Основы PHP

Логическое значение false в PHP

В PHP false - это одно из двух логических значений (булевых). Оно обозначает «ложь» и используется в условных конструкциях, циклах и проверках. Понимание того, как PHP обрабатывает false, помогает избежать многих ошибок, связанных с приведением типов и сравнением.

Как правильно проверить, является ли значение false?

Наиболее надёжный способ - использовать оператор строгого сравнения ===. Он проверяет и значение, и тип данных, поэтому не возникнет путаницы с числами, пустыми строками и другими «ложными» значениями.

$value = 0;
if ($value === false) {
    echo "$value строго false";
} else {
    echo "$value не строго false";
}
// Вывод: 0 не строго false
0 не строго false

Типичная ошибка - использование оператора ==, который перед сравнением приводит операнды к одному типу. Из‑за этого false может оказаться равным 0, пустой строке, null и даже пустому массиву. Например:

if (0 == false) {
    echo "0 равен false (нестрого)";
}
// Вывод: 0 равен false (нестрого)

Такой код может привести к неожиданным результатам в логике приложения, если ожидается только строгое false.

Как проверить, является ли значение «ложным» (falsy)?

Иногда требуется узнать, является ли значение «ложным» в логическом контексте - то есть приводится ли оно к false при преобразовании в булев тип. Для этого можно привести значение к bool с помощью (bool) или функции boolval().

$values = [0, '0', '', [], null, false, 'false'];
foreach ($values as $v) {
    if ((bool)$v === false) {
        echo "" . var_export($v, true) . " приводится к false\n";
    }
}
0 приводится к false
'0' приводится к false
'' приводится к false
array (
) приводится к false
NULL приводится к false
false приводится к false

Путаница возникает со строкой '0'. Она тоже считается ложной, хотя содержит символ. Это особенность PHP, которую нужно учитывать при обработке пользовательского ввода.

Как проверить, что переменная не установлена или равна false?

Для проверки существования переменной используется isset(), а для проверки именно на false - уже упомянутое строгое сравнение. Если объединить обе проверки, получается универсальный подход:

$x = false;
if (isset($x) && $x === false) {
    echo "Переменная существует и равна false";
}
$x = null;
if (isset($x) === false) {
    echo "Переменная не установлена или null";
}

Частая ошибка - использование empty() для проверки на false. Функция empty() возвращает true для всех ложных значений, включая 0, пустую строку и null. Она полезна, но не различает конкретные значения.

$data = 0;
if (empty($data)) {
    echo "empty считает 0 пустым\n";
}
if ($data === false) {
    echo "но 0 не равен false строго";
}

Результат может не совпадать с ожиданием.

Как явно получить false в результате функции?

Многие встроенные функции PHP возвращают false в случае ошибки или отсутствия данных. Например, strpos() возвращает false, если подстрока не найдена. Строгое сравнение с false обязательно, так как функция может вернуть 0 (первый символ), а 0 нестрого равен false.

$pos = strpos('Hello', 'H');
if ($pos === false) {
    echo "Подстрока не найдена";
} else {
    echo "Позиция: $pos";
}
// Вывод: Позиция: 0
// При нестрогом сравнении (==) получили бы неверный результат

Классическая ошибка - проверка if (!strpos(...)). Это приведёт к неправильному результату, когда strpos возвращает 0, так как !0 даёт true, хотя строка найдена в начале.

Расширенные примеры работы с false в PHP

Использование false в циклах

Цикл while может выполняться, пока условие истинно. Если условие изначально false, тело не выполнится ни разу.

Пример
$flag = false;
$count = 0;
while ($flag === true) {
    $count++;
}
echo $count; // 0
0

Но можно использовать false для управления циклом при помощи break.

Пример
$i = 0;
while (true) {
    $i++;
    if ($i > 3) {
        $flag = false;
        break;
    }
}
var_dump($flag); // bool(false)

Ложь в array_filter

По умолчанию array_filter удаляет все значения, которые приводятся к false.

Пример
$array = [0, 1, '', 'строка', false, null, '0'];
$filtered = array_filter($array);
print_r($filtered);
Array
(
    [1] => 1
    [3] => строка
)

Обратите внимание: '0' тоже удаляется, хотя это строка. Если нужно сохранить '0', используется callback.

Пример
$filtered = array_filter($array, function($val) {
    return $val !== false && $val !== null && $val !== '';
});
print_r($filtered);

Сравнение false с другими типами

При использовании оператора == сравнение с false может дать неожиданные результаты.

Пример
var_dump(false == 0);      // bool(true)
var_dump(false == '');     // bool(true)
var_dump(false == '0');    // bool(true)
var_dump(false == null);   // bool(true)
var_dump(false == array());// bool(true)
var_dump(false == 'false');// bool(false) - строка не пустая, не '0'

Все эти равенства, кроме последнего, считаются истинными в нестрогом сравнении. Поэтому всегда стоит проверять тип, если ожидается именно false.

Функция, возвращающая false, и обработка результата

Рассмотрим чтение файла: file_get_contents() возвращает строку или false в случае ошибки.

Пример
$content = @file_get_contents('nonexistent.txt');
if ($content === false) {
    echo "Файл не найден или ошибка чтения";
} else {
    echo "Файл прочитан, длина: " . strlen($content);
}

Использование @ подавляет ошибки, но не рекомендуется в production - лучше проверять через file_exists() или try/catch.

Преобразование false в строку и число

При неявном преобразовании false превращается в пустую строку и в число 0.

Пример
$b = false;
echo (string)$b;   // выводит пустую строку
echo (int)$b;      // 0
echo $b . ' - это false'; // пустая строка, затем текст

При конкатенации false превращается в пустую строку, что может быть неочевидно.

Ложь в switch

В конструкции switch сравнение происходит нестрого (==). Это приводит к тому, что несколько case могут совпасть с false.

Пример
$val = false;
switch ($val) {
    case false:
        echo "case false\n";
        break;
    case 0:
        echo "case 0\n";
        break;
    default:
        echo "default";
}
// Вывод: case false (первый совпавший)

Если убрать break в первом case, то выполнится и второй case, так как оба совпадают при нестрогой проверке.

Использование false в качестве аргумента по умолчанию для параметра

Часто параметру функции задают значение false, чтобы обозначить «не задано».

Пример
function findUser($id, $activeOnly = false) {
    if ($activeOnly === false) {
        // искать всех
    } else {
        // искать только активных
    }
}
findUser(5);         // $activeOnly = false
findUser(5, true);   // $activeOnly = true

Важно: значение false по умолчанию не следует путать с null. Если нужно различать «не передано» и «ложь», лучше использовать null.

Ложь (false) в PHP - comments

En
False php (php)