Заметка — Я знаю довольно много о пустой () а также Исеть (), какие
Я спрашиваю, это самый правильный / эффективный способ их использования.
Я только что видел в php.net это предложение под empty()
ссылка:
Предупреждение не генерируется, если переменная не существует. Это означает
пустой () по сути, краткий эквивалент !isset ($ var) || $ вар
== ложь.
Но опять же, поскольку я сейчас работаю в основном над приложениями других людей (либо автономными проектами, веб-сайтами, использующими cms или даже фреймворками), много раз я видел, как люди писали:
if (isset ($var) && $var != '')
// or
if (isset ($var) && !empty($var))
(в основном с переменными $ _GET и $ _POST, но не только)
Насколько я понимаю руководство, фрагмент ниже эквивалентен:
if (!empty($var))
Или я что-то упустил? Как технически лучше всего проверить существование переменной со значением?
Я знаю обе функции, их предназначение. Я просто хочу знать, если empty()
все нужно проверить если переменная установлена а также данное значение. Я знаю, что это работает, но это на 100% правильно и безопасно?
Коды операций, сгенерированные из 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'
это особый гоча.
Лично я использую только isset
, Если значение должно быть неempty
Затем я проверю это отдельно и сгенерирую ошибку (которая перехватывается подходящими блоками обработки ошибок), чтобы дать пользователю простую, точную ошибку «это значение требуется».
isset
просто скажет вам, если переменная установлена, независимо от значения (ноль, ложь и т. д.).
Если вы хотите проверить значение не пустой строки, используйте null, false или 0 empty
,
Если вы используете! (Empty ($ var)), тогда переменная устанавливается и содержит значение, которое может быть пустым, например «» или null или 0.
if(!empty($_COOKIE['dev'])) echo 'developer mode';
Если файл cookie есть, либо пустой, либо заполненный каким-либо значением, условие выполняется.
Иначе это будет проигнорировано.
Это полезно, если вы работаете с массивами и не знаете, установлен ли ключ, чтобы избежать предупреждений.
Когда вы оцениваете $ _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 ().
Как вы уже нашли. Я думаю, что использование только «пустого» может быть быстрее, но внутренне, вероятно, делает те же проверки.
Переменные 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?
*/
}