Перейти к содержимому
Теория · Условия · урок 3 из 8

Истинность значений

В прошлом уроке в условии if стояло сравнение, и оно давало true или false. Но PHP позволяет поставить в условие любое значение — число, строку, переменную.

Вернёмся к указателю на развилке. Он понимает только два ответа: «да» и «нет». Если вместо сравнения в условии стоит строка или число, PHP сначала переводит значение в true или false и только потом выбирает дорогу.

PHP
<?php

$name = 'Anna';
if ($name) {
    echo 'Hello, ', $name, "\n"; // Hello, Anna
}
$name = '';
if ($name) {
    echo 'Hello, ', $name, "\n";
} else {
    echo 'Who are you?', "\n"; // Who are you?
}

Разберём по шагам:

  1. if ($name) ни с чем не сравнивает $name: PHP переводит строку 'Anna' в логическое значение и получает true.
  2. Условие истинно, и программа печатает Hello, Anna.
  3. После $name = '' в переменной пустая строка, и она превращается в false.
  4. Поэтому во втором if выполняется ветка else, и программа печатает Who are you?.

Такая проверка удобна, но PHP решает по заранее заданному списку.

Ложные значения

Значение, которое в условии превращается в false, называют ложным значением. Запомните семь ложных значений:

  • false — само логическое «нет»;
  • 0 и 0.0 — целый и дробный ноль;
  • '' — пустая строка;
  • '0' — строка из одного символа, цифры ноль;
  • [] — пустой массив, то есть набор значений, в котором нет ни одного элемента;
  • null — «значения нет».

Всё остальное — истинные значения: любое ненулевое число, включая -1, любая другая строка, массив хотя бы с одним элементом. Если вы писали на JavaScript, запомните отдельно: там пустой массив истинен, а в PHP — ложен.

Список ложных значений любят спрашивать на собеседовании, и чаще всего — про строку '0'.

Строки-ловушки

Увидеть, во что превращается значение, помогает приведение (bool). Оно работает как (int) и (string) и даёт тот же результат, что и условие. echo печатает false как пустоту, поэтому результат выводят через var_dump:

PHP
var_dump((bool) '');      // bool(false)
var_dump((bool) '0');     // bool(false)
var_dump((bool) '0.0');   // bool(true)
var_dump((bool) ' ');     // bool(true)
var_dump((bool) 'false'); // bool(true)

Разберём по строкам:

  1. Пустая строка '' ложна.
  2. Строка '0' ложна, хотя в ней есть символ.
  3. Строка '0.0' истинна: PHP не читает её как число, а смотрит на текст — и это не '' и не '0'.
  4. Строка из одного пробела ' ' не пустая, поэтому истинна.
  5. Строка 'false' истинна: для PHP это пять букв, а не логическое значение.

Правило для строк: ложны ровно две строки, '' и '0'. Любая другая строка истинна, даже если выглядит как ноль или как слово «false».

Здесь аналогия с указателем неточна. Человек на развилке понял бы «0.0» и «0» одинаково, а PHP сверяется со списком: '0' для него «нет», а '0.0' — «да».

Частая ошибка

Значения из формы и из файла настроек приходят в программу строками. Флаг «администратор» пришёл как текст 'false', и его проверили напрямую:

PHP
$isAdmin = 'false';
if ($isAdmin) { // ✗
    echo 'admin panel', "\n";
} else {
    echo 'no access', "\n";
}

Программа печатает admin panel: строка 'false' истинна. Сообщения об ошибке нет, и доступ получает тот, кому его не давали. Такие строки сравнивайте явно:

PHP
if ($isAdmin === 'true') {
    echo 'admin panel', "\n";
} else {
    echo 'no access', "\n"; // no access
}

Главное

  • В условии PHP превращает любое значение в true или false.
  • Ложные значения — false, 0, 0.0, '', '0', [] и null; остальные значения истинны.
  • Из строк ложны только '' и '0': '0.0', ' ' и 'false' истинны.
  • Строки из формы сравнивайте явно, через ===, а не проверяйте их истинность.