Достаточно ли empty () или использовать isset ()?

Примечание - Я знаю довольно много о пустая() и isset (), что Я спрашиваю, Это самый правильный / эффективный способ их использования.

Я просто видел на php.net эту фразу под empty() ссылки:

предупреждение не генерируется, если переменная не существует. Те средства пустая() по существу является кратким эквивалентом !использования isset($VAR) как || $ВАР == ложные.

но опять же, поскольку я в основном работаю сейчас над приложениями других людей (автономными проектами, веб-сайтами с использованием cms или даже фреймворков), я много раз видел, как люди пишут:

if (isset ($var) && $var != '')
// or
if (isset ($var) && !empty($var))

(в основном с переменными $_GET и $_POST, но не только)

насколько я понимаю руководство, фрагмент ниже эквивалентен:

if (!empty($var))

или я что-то пропустила? Что технически лучший способ проверить существования переменной со значением?

Я знаю, что обе функции, их назначения. Я просто хочу знать, если empty() все необходимое для проверки если переменная set и данное значение. Я знаю, что это работает, но это 100% правильно и безопасно?

6 ответов


Op коды, созданные из isset($var) && !empty($var)

line     #  *  op                           fetch           ext  return  operands
---------------------------------------------------------------------------------


   3     0  >   EXT_STMT                                                 
         1      ISSET_ISEMPTY_VAR                      12800000    ~0       !0
         2  >   JMPZ_EX                                      ~0    ~0,     ->6
         3  >   ISSET_ISEMPTY_VAR                      11800000    ~1       !0
         4      BOOL_NOT                                     ~2    ~1
         5      BOOL                                         ~0    ~2
         6  >   FREE                                               ~0
   4     7  >   RETURN                                              1

и !empty($var)

line     #  *  op                           fetch           ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   EXT_STMT                                                 
         1      ISSET_ISEMPTY_VAR                      11800000    ~0       !0
         2      BOOL_NOT                                           ~1       ~0
         3      FREE                                                        ~1
   4     4  >   RETURN                                                       1

так что да, это повторяется ISSET_ISEMPTY_VAR но !$empty. Это зависит от переданного значения, но оно не существует, верхний путь-один код операции меньше BOOL_NOT. но если он существует, то нижний путь быстрее.

хотя вряд ли это будет узким местом в любом приложении


empty достаточно, но остерегайтесь его последствий.

если $var один из 0, '0', false, '', [], null (и, возможно, несколько других я забыл), тогда это будет считаться isset конечно, но это тоже будет empty. Обратите внимание, что строка '0' это особый gotcha.

лично я использую только isset. Если значение должно быть не -empty, затем я проверю это отдельно и выброшу ошибку (который пойман подходящими блоками обработки ошибок), чтобы дать пользователю простую, точную ошибку "это значение требуется".


isset просто скажет вам, установлена ли переменная, независимо от значения (null, false и т. д.).

Если вы хотите проверить, что значение не является пустой строкой, null, false или 0 используйте empty.


Если вы используете !(пустой ($var) тогда переменная установлена и содержит значение, которое может быть пустым, как "" или null или 0.

if(!empty($_COOKIE['dev'])) echo 'developer mode';

если файл cookie есть, пустой или заполненный любым значением, условие истинно. Иначе он будет проигнорирован.

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


когда вы оцениваете $_POST и $_GET, разница между isset и isempty полезна. Как вы сказали, not empty () var означает, что isset и значение были отправлены.

Так

if (!empty($var))

достаточно ceratinly для

if (isset ($var) && $var != '')

чего вам не хватает, так это иногда

if (isset($var)) {
  if ($var != '') {

  } else {
    ... do "A"
  }
} else {
  ... do something different from "A"
}

вам может понадобиться это. И если это происходит часто, когда это не произойдет, вы просто объедините два условия if и забудете о empty(). Как вы уже поняли. Я думаю что использование только "пустого" может быть быстрее, но внутренне, вероятно, он делает те же проверки.


переменные GET/POST/COOKIE должны быть проверены с помощью filter_input