Логические значения проверки PHP с использованием filter_var

Я использую filter_var для проверки логических значений, но я не ожидал, что он не распознает FALSE. Почему это происходит?

filter_var(FALSE, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)

возвращается

null


person RS7    schedule 03.02.2012    source источник
comment
вы хотите проверить логическое значение FALSE?   -  person rcs20    schedule 03.02.2012
comment
прочитайте это: devshed.com/c/a/PHP/   -  person rcs20    schedule 03.02.2012
comment
ну да, мне интересно, почему TRUE возвращает TRUE, а FALSE возвращает null   -  person RS7    schedule 03.02.2012
comment
Выглядит глючно. filter_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
comment
Вы можете избежать двусмысленности, используя приведение (bool) к результату: $val = FALSE; $val = (bool) filter_var($val, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);   -  person rdlowrey    schedule 03.02.2012
comment
@powtac Вы уверены, что он возвращает true? На моей машине filter_var(false, FILTER_VALIDATE_BOOLEAN) (без FILTER_NULL_ON_FAILURE) это false.   -  person DerVO    schedule 03.02.2012
comment
Я получаю тот же результат (ложь)   -  person RS7    schedule 03.02.2012
comment
@DerVO Извините, ребята, у меня тоже есть false. Удалил мой неправильный комментарий.   -  person powtac    schedule 03.02.2012
comment
Нашел это: bugs.php.net/bug.php?id=49510 -- к сожалению, к дате отчета, кажется, нет никакой спешки с исправлением этого   -  person RS7    schedule 03.02.2012


Ответы (3)


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)
person dkamins    schedule 03.02.2012

Звучит так, как будто это на самом деле должно работать, как ни странно (да, это меня потрясло). Из 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(), чтобы отметить, что это задумано, хотя код выглядит неправильно.

Закрытие не исправит.

person Machavity♦    schedule 30.01.2014

Это было поведение, когда filter_var впервые было представлено в версии 5.2 и разрешено в какой-то момент после 5.4, как видно из этого https://3v4l.org/Cv1MZ

Начиная с версии 5.4 происходит следующее:

var_dump(filter_var(FALSE, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));

логический (ложный)

что имеет гораздо больше смысла.

person apokryfos    schedule 26.01.2018