Логика проверки PHP с использованием filter_var - PullRequest
7 голосов
/ 03 февраля 2012

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

filter_var(FALSE, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)

возвращает

null

Ответы [ 3 ]

5 голосов
/ 03 февраля 2012

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)
2 голосов
/ 31 января 2014

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

Закрытие не будет исправлено.

0 голосов
/ 26 января 2018

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

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

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

BOOL (ложь)

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

...