Истинность значений
В прошлом уроке в условии if стояло сравнение, и оно давало true или false. Но PHP позволяет поставить в условие любое значение — число, строку, переменную.
Вернёмся к указателю на развилке. Он понимает только два ответа: «да» и «нет». Если вместо сравнения в условии стоит строка или число, PHP сначала переводит значение в true или false и только потом выбирает дорогу.
<?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?
}Разберём по шагам:
if ($name)ни с чем не сравнивает$name: PHP переводит строку'Anna'в логическое значение и получаетtrue.- Условие истинно, и программа печатает
Hello, Anna. - После
$name = ''в переменной пустая строка, и она превращается вfalse. - Поэтому во втором
ifвыполняется веткаelse, и программа печатаетWho are you?.
Такая проверка удобна, но PHP решает по заранее заданному списку.
Ложные значения
Значение, которое в условии превращается в false, называют ложным значением. Запомните семь ложных значений:
false— само логическое «нет»;0и0.0— целый и дробный ноль;''— пустая строка;'0'— строка из одного символа, цифры ноль;[]— пустой массив, то есть набор значений, в котором нет ни одного элемента;null— «значения нет».
Всё остальное — истинные значения: любое ненулевое число, включая -1, любая другая строка, массив хотя бы с одним элементом. Если вы писали на JavaScript, запомните отдельно: там пустой массив истинен, а в PHP — ложен.
Список ложных значений любят спрашивать на собеседовании, и чаще всего — про строку '0'.
Строки-ловушки
Увидеть, во что превращается значение, помогает приведение (bool). Оно работает как (int) и (string) и даёт тот же результат, что и условие. echo печатает false как пустоту, поэтому результат выводят через var_dump:
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)Разберём по строкам:
- Пустая строка
''ложна. - Строка
'0'ложна, хотя в ней есть символ. - Строка
'0.0'истинна: PHP не читает её как число, а смотрит на текст — и это не''и не'0'. - Строка из одного пробела
' 'не пустая, поэтому истинна. - Строка
'false'истинна: для PHP это пять букв, а не логическое значение.
Правило для строк: ложны ровно две строки, '' и '0'. Любая другая строка истинна, даже если выглядит как ноль или как слово «false».
Здесь аналогия с указателем неточна. Человек на развилке понял бы «0.0» и «0» одинаково, а PHP сверяется со списком: '0' для него «нет», а '0.0' — «да».
Частая ошибка
Значения из формы и из файла настроек приходят в программу строками. Флаг «администратор» пришёл как текст 'false', и его проверили напрямую:
$isAdmin = 'false';
if ($isAdmin) { // ✗
echo 'admin panel', "\n";
} else {
echo 'no access', "\n";
}Программа печатает admin panel: строка 'false' истинна. Сообщения об ошибке нет, и доступ получает тот, кому его не давали. Такие строки сравнивайте явно:
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'истинны. - Строки из формы сравнивайте явно, через
===, а не проверяйте их истинность.