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

Заметка — Я знаю довольно много о пустой () а также Исеть (), какие
Я спрашиваю, это самый правильный / эффективный способ их использования.

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

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

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

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

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

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

if (!empty($var))

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

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

23

Решение

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

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

19

Другие решения

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

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

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

14

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

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

4

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

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

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

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

3

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

Так

if (!empty($var))

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

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

то, что вы упускаете, просто иногда

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

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

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

3

Переменные 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() Функция, с другой стороны, просто проверяет, не установлена ​​ли переменная или ее значение falsy. Эту функцию нельзя использовать в ситуациях, когда ложные значения имеют смысл:

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?
*/
}
2
По вопросам рекламы [email protected]