Навіщо перевіряти і isset (), і! Empty ()


269

Чи є різниця між issetі !empty. Якщо я роблю цю подвійну булеву перевірку, чи правильно це так чи зайве? і чи існує коротший спосіб зробити те саме?

isset($vars[1]) AND !empty($vars[1])

3
Тут є хороша діаграма результатів використання їх із різними типами змінних (у них є відмінності) тут: virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Джефф Клейтон

Очевидними точними доповненнями є isset та is_null, але! Порожня обкладинка декількох різних. Все залежить від типу даних, які ви протестуєте.
Джефф Клейтон

Відповіді:


419

Це абсолютно зайве. 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. Крихітний фрагмент про те, що "не створюється попередження" дуже просто не помітити. Мені довелося кілька разів сканувати документацію, щоб помітити її, щоб розмістити її тут.
деге

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 - не єдиний. Досі не впевнений, яка у вас скарга.
деге

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";
}
?>

12

Прийнята відповідь не вірна.

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

Ви створите кілька досить неприємних і важких для відладки помилок, якщо підете по цьому маршруту. наприклад, спробуйте запустити цей код:

<?php

$s = '';

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

?>

https://3v4l.org/J4nBb


7
Прийнята відповідь ні в якому разі не говорить про те, що issetце рівнозначно !empty.
деге

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 (порожній), ви побачите, що це вважається порожнім

* "" (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)

у той час як isset перевірити, чи є змінна isset, а не null, що також можна знайти в php doc (isset)


2

Це не обов'язково.

Якщо змінна не існує, попередження не створюється. Це означає, що порожній () по суті є лаконічним еквівалентом! Isset ($ var) || $ var == false.

php.net


2
Це ніколи не було необхідним у будь-якій версії PHP, оскільки порожня вже перевіряє (не) набір. Ви плутаєте той факт, що порожнє тепер підтримує вирази із запитанням.
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");

Невизначена змінна повинна бути оцінена зовнішньою функцією, оскільки сама функція створює тимчасову змінну в межах самої області.


0

"Порожня": працює лише на змінних. Порожня може означати різні речі для різних типів змінних (перевірити посібник: http://php.net/manual/en/function.empty.php ).

"isset": перевіряє наявність змінної та перевіряє справжнє NULL або хибне значення. Відключити можна за допомогою виклику "unset". Ще раз перевірте інструкцію.

Використання будь-якого з них залежить від типу змінної, яку ви використовуєте.

Я б сказав, що безпечніше перевірити обидва, адже ви перевіряєте насамперед, чи існує змінна, і чи вона насправді НУЛЬНА чи порожня.


3
@szahn "безпечніше перевірити на обидва", - ви як програміст можете перевірити все, що вам потрібно для безпеки. Але якщо ваш код зайвий, ви можете бути надлишковим як програміст.
мадлопт

0

якщо ми використовуємо ту саму сторінку для додавання / редагування за допомогою кнопки подання, як показано нижче

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

тоді ми не повинні користуватися

isset($_POST['edit_id'])

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

!empty($_POST['edit_id'])

попередня публікація була подана bcoz я натискаю Enter помилково, ось моя повна відповідь ... чому downvote? :(
diEcho

0
  • На веб-сайті PHP, посилаючись на empty()функцію:

Повертається, FALSEякщоvar має значення не порожнє та ненулеве значення.

Це добре знати. Іншими словами, все , від NULL, до 0до «» повернеться TRUEпри використанні empty()функції.

  • Ось опис того, що isset()функція повертає:

Повертається, TRUEякщо varіснує;FALSEінакше.

Іншими словами, тільки змінні , які не існують (або, змінних зі строго NULLзначеннями) буде повертати FALSEна isset()функції. Повертаються всі змінні, які мають будь-який тип значення, будь то 0пустий текстовий рядок тощо TRUE.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.