Сравнение string и bool в PHP (это надо знать)

Сегодня простыми словами и на простом примере покажу один важный момент, который зачастую пьёт много крови даже у опытных программистов.

Поговорим об операторах сравнения и типах данных. Предположим у нас есть две переменных: $x и $y. Одна из них имеет значение false, а другая представляет собой пустую строку string. Человеческий мозг устроен так, что при чтении кода мы воспринимаем оба варианта как ПУСТОТУ. Происходит это потому, что если применить к обоим переменным оператор echo, то вывода на экран не произойдёт. Проблемы же начинаются тогда, когда в коде мы пытаемся проверить, пусто ли значение или нет привычным мозгу способом через =="". Приведу пример:

$x = false; $y = (string)'';
if ($x == '') {
   echo PHP_EOL.'false РАВЕН пустоте string';  
} else {
   echo PHP_EOL.'false НЕ РАВЕН пустоте string';  
}

if ($x === '') {
   echo PHP_EOL.'false РАВЕН пустоте string';  
} else {
   echo PHP_EOL.'false НЕ РАВЕН пустоте string';  
}

if ($x !== '') {
   echo PHP_EOL.'false НЕ РАВЕН пустоте string';      
} else {
   echo PHP_EOL.'false РАВЕН пустоте string';
}

Когда мы читаем данный код, то подсознательно ожидаем, что код трижды выведит нам строку "false РАВЕН пустоте string", однако это не так!

На самом деле мы получим вот такой ответ:

false РАВЕН пустоте string
false НЕ РАВЕН пустоте string
false НЕ РАВЕН пустоте string

Т.е так, как ожидает наш мозг, код отработает только в первом случае. Решением же данного вопроса является использование empty вместо сравнивания с "":

$x = false;
if (empty($x)) {
   echo PHP_EOL.'false РАВЕН пустоте string';      
} else {
   echo PHP_EOL.'false НЕ РАВЕН пустоте string';  
}

Помните об этой особенности, так вы сэкономите кучу времени в поисках неочевидных ошибок!

Рейтинг: 5

2022-11-04 / / 0 комментариев / Про кодинг и сервер /