我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));
布尔(假)
这更有意义。
根据文档
对于“1”、“true”、“on”和“yes”返回 true。否则返回 false。
任何与上述值不同的值都被认为是虚假的。这不是要测试变量是否实际上是类似typeof
or的布尔值is_bool()
,而更像是测试来自用户的输入(通常是<input type="checkbox">
表单)是否是truthy/falsy
.
这个函数的行为可以被理解为let it go through if it's correct
测试变量类型而不是测试变量的类型(我们有很多其他的函数)。示例:
filter_var('435345', FILTER_VALIDATE_INT)
类型是字符串,但结果不是真/假,因为目的不是验证类型。所以 anint
会被退回(放过)。