if语句在函数旁边使用感叹号时使用的逻辑

时间:2015-03-17 09:36:02

标签: php logic

这是来自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抛出一个成功的消息。难道不是那么令人困惑吗?

2 个答案:

答案 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");
}