Зачем проверять isset () и! Empty ()

269

Есть ли разница между issetи !empty. Если я делаю эту двойную булеву проверку, это правильно или избыточно? и есть ли более короткий способ сделать то же самое?

isset($vars[1]) AND !empty($vars[1])
silow
источник
3
Вот хорошая диаграмма результатов их использования с различными типами переменных (у них есть различия) здесь: virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Джефф Клейтон
Очевидными точными дополнениями являются isset и is_null, но! Empty охватывает несколько разных. Все зависит от типа данных, которые вы проверяете.
Джефф Клэйтон

Ответы:

420

Это полностью избыточно. emptyболее или менее сокращенно !isset($foo) || !$foo, и !emptyаналогично isset($foo) && $foo. Т.е. emptyпроисходит обратное действие issetплюс дополнительная проверка на достоверность значения.

Или, другими словами, emptyто же самое !$foo, но не выдает предупреждения, если переменная не существует. Это основной смысл этой функции: проводить логическое сравнение, не беспокоясь об установленной переменной.

В руководстве это выглядит так:

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

Вы можете просто использовать !empty($vars[1])здесь.

децезе
источник
7
Но тогда, если нет, $vars[1]он получит уведомление.
karim79
6
Я понятия не имею, откуда я взял эту идею. Плюс один
karim79
8
@karim IMO empty- одна из самых неправильно понимаемых функций в PHP. Крошечный фрагмент о том, что «предупреждение не генерируется», очень легко пропустить. Мне пришлось несколько раз отсканировать документацию, чтобы найти ее здесь.
deceze
2
empty($vars[1])не вызывает никаких предупреждений, даже $vars[1]не установлен, но echo $vars[1]будет. Я проверил факт с помощью echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;.
Амил Вадувавара
4
@Shahor Многие языки считают, 0что false. PHP не единственный. Все еще не уверен, что ваша жалоба.
deceze
33

isset() проверяет, установлена ​​ли переменная, а не ноль:

http://us.php.net/manual/en/function.isset.php

empty() может вернуть true, если для переменной заданы определенные значения:

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

Чтобы продемонстрировать это, попробуйте следующий код с ненастроенным $ the_var, установите в 0 и установите в 1.

<?php

#$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>
GreenMatt
источник
12

Принятый ответ не верен.

isset () НЕ эквивалентно! empty ().

Если вы пойдете по этому пути, вы создадите несколько неприятных и трудных для отладки ошибок. например, попробуйте запустить этот код:

<?php

$s = '';

print "isset: '" . isset($s) . "'. ";
print "!empty: '" . !empty($s) . "'";

?>

https://3v4l.org/J4nBb

Snowcrash
источник
7
Принятый ответ никоим образом не предполагает, что issetэто эквивалентно !empty.
deceze
8
$a = 0;
if (isset($a)) { //$a is set because it has some value ,eg:0
    echo '$a has value';
}
if (!empty($a)) { //$a is empty because it has value 0
    echo '$a is not empty';
} else {
    echo '$a is empty';
}
Раджмохан
источник
1
Но вы не обработали переменную, а не установили регистр.
Амил Вадувавара
3

Пустой, просто проверьте, является ли указанная переменная / массив имеет значение, если вы проверите php doc (пусто), вы увидите, что эти вещи считаются emtpy.

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

while isset проверяет, является ли переменная isset, а не ноль, что также можно найти в php doc (isset)

Breezer
источник
2

Это не обязательно.

Предупреждение не генерируется, если переменная не существует. Это означает, что empty () по сути является кратким эквивалентом! Isset ($ var) || $ var == false.

php.net

madlopt
источник
2
Это никогда не было необходимо ни в одной версии PHP, так как empty уже проверяет (не) isset. Вы путаете тот факт, что empty теперь поддерживает выражения с вопросом.
alxgb
Это правда, пять лет спустя.
Леннон
2

isset($vars[1]) AND !empty($vars[1])эквивалентно !empty($vars[1]).

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

Последняя строка является неопределенной переменной.

+-----------+---------+---------+----------+---------------------+
| Var value | empty() | isset() | !empty() | isset() && !empty() |
+-----------+---------+---------+----------+---------------------+
| ''        | true    | true    | false    | false               |
| ' '       | false   | true    | true     | true                |
| false     | true    | true    | false    | false               |
| true      | false   | true    | true     | true                |
| array ()  | true    | true    | false    | false               |
| NULL      | true    | false   | false    | false               |
| '0'       | true    | true    | false    | false               |
| 0         | true    | true    | false    | false               |
| 0.0       | true    | true    | false    | false               |
| undefined | true    | false   | false    | false               |
+-----------+---------+---------+----------+---------------------+

И код

$var1 = "";
$var2 = " ";
$var3 = FALSE;
$var4 = TRUE;
$var5 = array();
$var6 = null;
$var7 = "0";
$var8 = 0;
$var9 = 0.0;

function compare($var)
{
    print(var_export($var, true) . "|" .
        var_export(empty($var), true) . "|" .
        var_export(isset($var), true) . "|" .
        var_export(!empty($var), true) . "|" .
        var_export(isset($var) && !empty($var), true) . "\n");
}

for ($i = 1; $i <= 9; $i++) {
    $var = 'var' . $i;
    compare($$var);
}

@print(var_export($var10, true) . "|" .
    var_export(empty($var10), true) . "|" .
    var_export(isset($var10), true) . "|" .
    var_export(!empty($var10), true) . "|" .
    var_export(isset($var10) && !empty($var10), true) . "\n");

Неопределенная переменная должна оцениваться вне функции, поскольку сама функция создает временную переменную в самой области видимости.

Tajni
источник
0

«Пусто»: работает только с переменными. Пустой может означать разные вещи для разных типов переменных (см. Руководство: http://php.net/manual/en/function.empty.php ).

«isset»: проверяет, существует ли переменная, и проверяет истинное NULL или ложное значение. Может быть сброшен, вызвав «unset». Еще раз проверьте руководство.

Использование любого из них зависит от типа используемой переменной.

Я бы сказал, что безопаснее проверять оба, потому что вы проверяете в первую очередь, существует ли переменная, и не является ли она действительно NULL или пустой.

Стюарт
источник
3
@szahn «безопаснее проверять и то и другое», - вы, как программист, можете проверить все, что вы хотите, для безопасности. Но если ваш код избыточен, вы можете быть избыточным как программист.
Madlopt
0

если мы используем ту же страницу, чтобы добавить / изменить через кнопку отправки, как показано ниже

<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

тогда мы не должны использовать

isset($_POST['edit_id'])

bcoz edit_idустанавливается постоянно, будь то страница добавления или редактирования, вместо этого мы должны использовать условие проверки ниже

!empty($_POST['edit_id'])
diEcho
источник
предыдущий пост был отправлен bcoz я нажимаю ввод по ошибке, вот мой полный ответ ... почему downvote? :(
diEcho
0
  • С веб-сайта PHP, ссылаясь на empty()функцию:

Возвращает FALSEif varимеет непустое и ненулевое значение.

Это хорошо знать. Другими словами, все от NULL, до 0«» вернется TRUEпри использовании empty()функции.

  • Вот описание того, что isset()возвращает функция:

Возвращает, TRUEесли varсуществует; FALSEв противном случае.

Другими словами, только переменные, которые не существуют (или переменные со строго NULLзначениями), будут возвращаться FALSEв isset()функцию. Все переменные, которые имеют любой тип значения, будь то 0пустая текстовая строка и т. Д., Будут возвращены TRUE.

Ende
источник