if ($ val) против if ($ val! = "") против if (! empty ($ val)) - какой? - PullRequest
9 голосов
/ 12 сентября 2011

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

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

Ответы [ 6 ]

20 голосов
/ 12 сентября 2011

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

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

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

Я обнаружил, что:

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

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

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

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

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

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

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

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

5 голосов
/ 12 сентября 2011

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

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

0 голосов
/ 12 сентября 2011

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

0 голосов
/ 12 сентября 2011

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

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

0 голосов
/ 12 сентября 2011

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

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

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

0 голосов
/ 12 сентября 2011

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

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

if(isset($foo) && $foo != '')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...