if ($ val) vs. if ($ val! = "") против if (! empty ($ val)) – какой?

Я вижу, что многие люди используют различные методы для проверки того, является ли переменная пустой, на самом деле, похоже, нет консенсуса. Я слышал, что if($foo) точно такой же, как if(!empty($foo)) или if($foo != "") . Это правда?

Я понимаю, что это очень простой вопрос, но мне очень хотелось бы знать. Есть ли различия? Какой метод я должен использовать?

Разница между голым тестом и сравнением с пустой строкой

if($foo != "") эквивалентно if($foo) большую часть времени, но не всегда .

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

Я узнал, что:

  • если $foo === array() , тест if($foo != "") будет успешным (массивы «больше, чем»), но тест if($foo) завершится неудачно (пустые массивы преобразуются в логическое значение false )
  • если $foo === "0" (строка), тест if($foo != "") снова будет успешным (очевидно), но тест if($foo) завершится неудачно (строка "0" преобразуется в boolean false )
  • если $foo – это объект SimpleXML, созданный из пустого тега, тест if($foo != "") снова будет успешным (объекты «больше чем»), но тест if($foo) завершится неудачно (такие объекты преобразовать в boolean false )

См. Различия в действии .

Лучший способ проверить

Предпочтительным методом тестирования является if(!empty($foo)) , что не совсем равно указанному выше:

  1. Он не страдает от несоответствий if($foo != "") (Что ИМХО просто ужасно).
  2. Он не будет генерировать E_NOTICE если $foo не присутствует в текущей области, что является его основным преимуществом перед if($foo) .

Здесь есть оговорка: если $foo === '0' (строка длины 1), то empty($foo) вернет true , что обычно (но может и не всегда ) быть тем, что вы хотите. Это также относится к if($foo) .

Иногда вам нужно протестировать с помощью идентичного оператора

Наконец, исключение из вышеизложенного должно быть сделано, когда есть определенный тип значения, которое вы хотите проверить. В качестве примера strpos может возвращать 0 а также может возвращать false . Оба из этих значений не пройдут тест if(strpos(...)) , но они имеют совершенно разные значения. В этих случаях тест с идентичным оператором выполняется следующим образом: if(strpos() === false) .

Нет, это не всегда так. Когда вы делаете if($foo) PHP переводит переменную в Boolean. Пустая строка, целое число нуля или пустой массив будут false . Иногда это может быть проблемой.

Вы всегда должны стараться использовать наиболее точное сравнение, если вы ожидаете строку, которая может быть пустой, if($foo==='') (обратите внимание на три одинаковых знака). Если вы ожидаете либо (логическое) значение false, либо ресурс (например, из запроса БД), используйте if($foo===false){...} else {...}

Вы можете прочитать документацию о кастинге для логического поиска, чтобы найти ответ на этот вопрос. Там есть список, значения которого преобразуются в true и false соответственно.

Обратите внимание, что empty также проверяет, установлена ​​ли переменная, которой не производится обычное сравнение. Переменная unset вызывает ошибку типа E_NOTICE во время сравнения, но не при использовании пустого. Вы можете обойти это, используя вызов isset перед сравнением, например:

 if(isset($foo) && $foo != '') 

if() «преобразует» утверждение, данное bool, поэтому взглянуть на документацию для boolean – это то, что вы ищете. в целом:

  • пустые строки ( "" ), пустые массивы ( array() ), ноль ( 0 ) и логические ложные ( false ) рассматриваются как false
  • все остальное ( "foo" , 1 , array('foo') , true , …) трактуется как true

РЕДАКТИРОВАТЬ :
для получения дополнительной информации вы также можете проверить таблицы сравнения типов .

empty ($ foo) должен возвращать true во всех этих случаях: 0, "", NULL.

Для получения более полного списка проверьте эту страницу: http://php.net/manual/en/function.empty.php

Нет, это не равно. Если переменная не определена, выражение без empty будет генерировать уведомление о неопределенной переменной.