Достаточно пуст() или используется 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% правилен и безопасен?
Ответы
Ответ 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?
*/
}