Я использую filter_var
для проверки логических значений, но я не ожидал, что он не распознает FALSE
. Почему это происходит?
filter_var(FALSE, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
возвращается
null
Я использую filter_var
для проверки логических значений, но я не ожидал, что он не распознает FALSE
. Почему это происходит?
filter_var(FALSE, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
возвращается
null
filter_var
появился в PHP 5.2. Вы столкнулись с известной ошибкой: https://bugs.php.net/bug.php?id=49510 Не стесняйтесь голосовать или комментировать эту ошибку.
Вы пытаетесь сделать что-то вроде этого:
$v = filter_var($v, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Есть несколько дешевых обходных путей, таких как этот:
$v = $v===FALSE ? FALSE : filter_var($v, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Звучит так, как будто это на самом деле должно работать, как ни странно (да, это меня потрясло). Из https://bugs.php.net/bug.php?id=51344
Это будет звучать безумно, когда вы посмотрите на базовый код фильтра, но на самом деле это правильно согласно документации: поведение filter_input() по умолчанию — возвращать NULL для несуществующих входных данных и false, когда проверка не удалась, и FILTER_NULL_ON_FAILURE просто меняет это поведение на false для несуществующих входных данных и NULL при сбое проверки. (Нет, я понятия не имею, где это может быть полезно, и имя флага неудачно в контексте filter_input(), так как подразумевает, что NULL обычно не будет возвращаться. Это имеет больше смысла при использовании с filter_var(), у которого нет несуществующего входного регистра.)
[таблица опущена из-за форматирования SO]
Я добавлю комментарий к реализациям filter_input() и filter_input_array(), чтобы отметить, что это задумано, хотя код выглядит неправильно.
Закрытие не исправит.
Это было поведение, когда filter_var
впервые было представлено в версии 5.2 и разрешено в какой-то момент после 5.4, как видно из этого https://3v4l.org/Cv1MZ
Начиная с версии 5.4 происходит следующее:
var_dump(filter_var(FALSE, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));
логический (ложный)
что имеет гораздо больше смысла.
TRUE
возвращает TRUE, аFALSE
возвращает null - person RS7   schedule 03.02.2012filter_var(false, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
этоnull
,filter_var(0, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
этоfalse
. у меня 5.3.3 - person DerVO   schedule 03.02.2012(bool)
к результату:$val = FALSE; $val = (bool) filter_var($val, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
- person rdlowrey   schedule 03.02.2012true
? На моей машинеfilter_var(false, FILTER_VALIDATE_BOOLEAN)
(безFILTER_NULL_ON_FAILURE
) этоfalse
. - person DerVO   schedule 03.02.2012false
. Удалил мой неправильный комментарий. - person powtac   schedule 03.02.2012