Я вижу, что многие люди используют различные методы для проверки того, является ли переменная пустой, на самом деле, похоже, нет консенсуса. Я слышал, что 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 будет генерировать уведомление о неопределенной переменной.