isset () и empty () - что использовать

105

Не могли бы вы помочь мне улучшить мой стиль кодирования? :) В некоторых задачах мне нужно проверять - переменная пуста или что-то содержит. Для решения этой задачи я обычно делаю следующее.

Проверьте - задана эта переменная или нет? Если установлен - проверяю - пусто или нет?

<?php
    $var = '23';
    if (isset($var)&&!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

И у меня вопрос - следует ли использовать isset () перед empty () - это необходимо? TIA!

Дмитрий Белавенцев
источник
пусто - это! isset ($ var) || $ var == false
zloctb
2
на мой взгляд, empty () - ужасное развитие PHP. Поскольку он рассматривает «0» в любой форме как «пустой», вы можете попасть в плохие ловушки, требующие много времени на отладку. Я бы сказал: избегайте любой ценой и просто напишите логику самостоятельно
Джон

Ответы:

143

Это зависит от того, что вы ищете, если вы просто хотите увидеть, пусто ли оно, просто используйте, emptyкогда он проверяет, установлен ли он, если вы хотите знать, установлено ли что-то или не используется isset.

Empty проверяет, установлена ​​ли переменная, и если это так, проверяет ее на null, "", 0 и т. д.

Isset просто проверяет, установлен ли он, это может быть что угодно, кроме нуля

С emptyпустыми считаются следующие объекты:

  • "" (пустая строка)
  • 0 (0 как целое число)
  • 0,0 (0 в виде числа с плавающей точкой)
  • «0» (0 в виде строки)
  • НОЛЬ
  • ЛОЖНЫЙ
  • array () (пустой массив)
  • var $ var; (объявленная переменная, но без значения в классе)

С http://php.net/manual/en/function.empty.php


Как упоминалось в комментариях, отсутствие предупреждения также важно с empty ()

Руководство по PHP говорит

empty () является противоположностью (boolean) var, за исключением того, что предупреждение не генерируется, если переменная не установлена .

Что касается isset

Руководство по PHP говорит

isset () вернет FALSE, если проверяет переменную, для которой установлено значение NULL


Ваш код будет в порядке:

<?php
    $var = '23';
    if (!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

Например:

$var = "";

if(empty($var)) // true because "" is considered empty
 {...}
if(isset($var)) //true because var is set 
 {...}

if(empty($otherVar)) //true because $otherVar is null
 {...}
if(isset($otherVar)) //false because $otherVar is not set 
 {...}
Pez Cuckow
источник
Это значит - в приведенном выше коде я дважды проверяю, установлена ​​ли переменная или нет? :)
Дмитрий Белавенцев
Просто проверьте, пусто ли оно, php не выдаст ошибку, если это не так.
Pez Cuckow
3
Вы упускаете самый важный момент empty: он не выдает предупреждения, когда проверяемая переменная не существует. В этом весь смысл этой функции, в остальном она идентична == false.
deceze
1
Так что меня смутил тот факт, что в руководстве "предупреждение не выводится, если переменная не установлена". Отсутствие предупреждения не означает, что у меня не будет проблем с приведенным ниже кодом. Теперь мне все ясно. Большое спасибо!
Дмитрий Белавенцев
"isset просто проверяет, установлен ли он, он все еще может быть нулевым" Это неверно: issetдля нулевой (и существующей) переменной будет вычисляться значение false.
netcoder
12

В вашем конкретном случае: if ($var).

Вам нужно использовать, issetесли вы не знаете , существует ли переменная или нет. Поскольку вы объявили его в самой первой строке, вы знаете, что он существует, поэтому вам не нужно, нет, не следует использовать isset.

То же самое empty, только в emptyсочетании с проверкой истинности значения. emptyэквивалентно !isset($var) || !$varи !emptyэквивалентно isset($var) && $var, или isset($var) && $var == true.

Если вы хотите только проверить переменную, которая должна существовать на истинность , if ($var)это совершенно адекватно и по существу.

обмануть
источник
Этот объясняет намного лучше. Если мы получим сравнение для всех других подобных случаев !empty is equivalent to isset($var) && $var, это будет здорово. Спасибо @deceze
Вир
6

Вы можете просто использовать empty () - как показано в документации , он вернет false, если переменная не имеет значения.

Пример на той же странице:

<?php
$var = 0;

// Evaluates to true because $var is empty
if (empty($var)) {
    echo '$var is either 0, empty, or not set at all';
}

// Evaluates as true because $var is set
if (isset($var)) {
    echo '$var is set even though it is empty';
}
?>

Вы можете использовать isset, если просто хотите знать, не является ли оно NULL. В противном случае кажется, что empty () можно использовать отдельно.

Крис
источник
Объяснение голосования против? Он не спрашивает, одинаковы ли они, он спрашивает, нужно ли ему проверять isset перед проверкой пустого.
Крис
Я не downvote, но «использование Исеть , если вы хотите знать , что это не является нулевой» не является правильным: $var = null; isset( $var ) == true.
JJJ
Из руководства PHP5 / 4: isset () - «Определить, установлена ​​ли переменная и не является ли она NULL». us.php.net/manual/en/function.isset.php
Крис
2

Вот выходы isset()и empty()для 4 возможности: необъявленные, NULL, ложного и правды.

$a=null;
$b=false;
$c=true;

var_dump(array(isset($z1),isset($a),isset($b),isset($c)),true); //$z1 previously undeclared
var_dump(array(empty($z2),empty($a),empty($b),empty($c)),true); //$z2 previously undeclared

//array(4) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(true) [3]=> bool(true) } 
//array(4) { [0]=> bool(true) [1]=> bool(true) [2]=> bool(true) [3]=> bool(false) } 

Вы заметите, что все результаты «isset» противоположны «пустым» результатам, за исключением case $b=false. Все значения (за исключением null, который не является значением, а не значением), которые оцениваются как false, вернут true при проверке на by issetи false при проверке на 'empty'.

Так что используйте, isset()когда вас беспокоит существование переменной. И используйте, emptyкогда вы проверяете истинность или ложь. Если фактический тип вопросов пустоты, использования is_nullи ===0, ===false, ===''.

dnagirl
источник
1

Empty возвращает true, если переменная не установлена. Но isset возвращает true, даже если переменная не пуста.

Вискас
источник
-3
$var = 'abcdef';
if(isset($var))
{
   if (strlen($var) > 0);
   {
      //do something, string length greater than zero
   }
   else
   {
     //do something else, string length 0 or less
   }
}

Это простой пример. Надеюсь, поможет.

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

Акос
источник
7
strlen под нулем? Я хочу увидеть эту строку.
deceze
@deceze Просто грубый пример :) ОК use = 0 not <0
Akos