这是w3schools PHP中的一些代码,涉及验证数据。
这已经困扰我好几个小时了
但这里的问题是关于他们使用的if语句;为什么他们在filter_var()
函数之前使用Exclaimation Mark(!)。从逻辑的角度来看,这对我来说没有意义,因为我很确定filter_var()
函数不是布尔函数。
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
echo("$ip is a valid IPv6 address");
} else {
echo("$ip is not a valid IPv6 address");
}
?>
最后,上面的if语句是如何工作的,因为在前面的章节中,他们写了以下内容:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Invalid email format";
}
它说"如果电子邮件无效,则抛出一个错误"。然而,在这个问题顶部的代码中,它说"如果电子邮件NOT有效,从而返回false
,而这是===
到false
,则抛出一条成功消息。这不是令人困惑吗?
filter_var
如果输入值$ip
有效,则返回该值。有效的IPV6地址是"truthy"(它是一个非空字符串)。应用于真值的!
运算符产生false
。
因此,如果$ip
是有效的,那么!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false
。
请记住,!
的优先级高于===
。这就是问题中的两个代码示例的不同之处。
如果测试失败,filter_var
将返回false
,因此另一种非常好(也许更清晰)的测试方法是:
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
// $ip is valid
}
第二段代码有效地做了同样的事情(检查filter_var
的结果是false
),尽管它是以一种不那么明确的方式这样做的。
函数:filter_var()
返回混合var类型,表示
String如果效果良好
如果发生错误,则返回布尔值/FLSE
所以测试是正确的:
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
echo("$ip is a valid IPv6 address");
} else {
echo("$ip is not a valid IPv6 address");
}