这是来自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";
}
其中说“如果电子邮件不有效,则抛出错误”。但是,在此问题顶部的代码中,它显示“如果电子邮件不有效,从而返回false
,这是===
到false
抛出一个成功的消息。难道不是那么令人困惑吗?
答案 0 :(得分:0)
filter_var
返回输入值$ip
(如果有效)。有效的IPV6地址是" truthy" (它是一个非空字符串)。应用于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
),尽管它以不太明确的方式这样做。
答案 1 :(得分:0)
函数:filter_var()
返回混合var类型,表示
字符串,如果它运作良好;
如果发生错误,布尔/ FALSE ;
所以测试是正确的:
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");
}