Подтвердить что ты не робот

Достаточно пуст() или используется isset()?

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

Я только что увидел в php.net это предложение в empty() ссылке:

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

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

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

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

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

if (!empty($var))

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

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

4b9b3361

Ответ 1

Коды 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. но если он существует, то нижний путь быстрее.

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

So

if (!empty($var))

достаточно достоверно для

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

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

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

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

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

Ответ 6

Переменные GET/POST/COOKIE следует проверить с помощью filter_input. Эта функция может проверить, присутствует ли указанный ключ во вводе (GET/POST/COOKIE/etc) и, возможно, его фильтрация. Пример:

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
/*
 * QUERYSTRING           RESULT
 * ==================    ===============
 * test.php?             $id is NULL
 * test.php?id=          $id is FALSE
 * test.php?id=123abc    $id is FALSE
 * test.php?id=123       $id is int(123)
 */
if ($id !== NULL && $id !== FALSE) { /*...*/ }

Функция empty(), с другой стороны, просто проверяет, не задана ли переменная или ее значение ложно. Эта функция не может использоваться в ситуациях, когда значения фальши имеют смысл:

if (empty($_GET["number_of_children"])) {
    /*
     * GET parameter is not set or its value is zero or falsy
     * Show an error? Or process the value?
     */
}
if (empty($_GET["number_of_children"]) === false) {
    /*
     * Definitely a truthy value
     * But how does one specify that he/she has no children?
     */
}