10

filter_var用来验证布尔值,但没想到它无法识别FALSE。为什么会这样?

filter_var(FALSE, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)

返回

null

4

4 回答 4

8

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)
于 2012-02-03T19:57:16.833 回答
2

听起来这实际上是它应该如何工作的,奇怪的是(是的,我的想法被震撼了)。来自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() 实现中添加注释,以说明这是设计使然,即使代码看起来确实有点错误。

关闭不会修复。

于 2014-01-30T23:12:19.800 回答
0

这是在filter_var5.2 版本中首次引入并在 5.4 之后的某个时候解决的行为,正如https://3v4l.org/Cv1MZ所见

从 5.4 版开始,会发生以下情况:

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

布尔(假)

这更有意义。

于 2018-01-26T15:11:14.850 回答
0

根据文档

对于“1”、“true”、“on”和“yes”返回 true。否则返回 false。

任何与上述值不同的值都被认为是虚假的。这不是要测试变量是否实际上是类似typeofor的布尔值is_bool(),而更像是测试来自用户的输入(通常是<input type="checkbox">表单)是否是truthy/falsy.

这个函数的行为可以被理解为let it go through if it's correct测试变量类型而不是测试变量的类型(我们有很多其他的函数)。示例:

filter_var('435345', FILTER_VALIDATE_INT)

类型是字符串,但结果不是真/假,因为目的不是验证类型。所以 anint会被退回(放过)。

于 2022-02-22T11:29:04.313 回答