Я вижу, что многие люди используют различные методы для проверки того, является ли переменная пустой, на самом деле, похоже, нет консенсуса. Я слышал, что 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))
, что не совсем равно указанному выше:
if($foo != "")
(Что ИМХО просто ужасно). 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
будет генерировать уведомление о неопределенной переменной.