Разница между пустым тестом и сравнением с пустой строкой
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))
,который не в точности равен вышеуказанному в том, что:
- Он не страдает от несоответствий
if($foo != "")
(что, IMHO, просто ужасно). - Он не будет генерировать
E_NOTICE
, если $foo
не присутствует в текущей области видимости, что является его основным преимуществом перед if($foo)
.
Здесь есть предостережение: если $foo === '0'
(строка длиной 1), тогда empty($foo)
вернет true
, что обычно (но не может всегда быть) тем, что вы хотите.Это также относится и к if($foo)
.
Иногда вам нужно протестировать с идентичным оператором
Наконец, исключение из вышеперечисленного должно быть сделано при наличии определенного типа значенияВы хотите проверить на.Например, strpos
может возвращать 0
, а также может возвращать false
.Оба эти значения не пройдут тест if(strpos(...))
, но имеют совершенно разные значения.В этих случаях проводится проверка с идентичным оператором : if(strpos() === false)
.