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

Logic used in if statement using Exclamation Mark beside function

这是来自 w3schools PHP 的一些代码,涉及验证数据。

这已经困扰我好几个小时了。

但是这里的问题是关于他们使用的 if 语句;他们为什么在 filter_var() 函数之前使用感叹号 (!)。从逻辑的角度来看,这对我来说没有意义,语句到底问了什么,因为我很确定 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"; 
}

这表示 "if the email is NOT valid, throw an error"。然而,在这个问题顶部的代码中,它说“如果电子邮件 NOT 有效因此返回 false 并且这是 ===false 抛出成功信息,是不是很迷惑?

filter_var returns 输入值 $ip 如果有效。有效的 IPV6 地址是 "truthy"(它是一个非空字符串)。应用于真值的 ! 运算符产生 false

因此,如果 $ip 有效,则 !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false

请记住 !=== 具有 更高的优先级 。这就是您问题中的两个代码示例不同的原因。


filter_var returns false 如果测试失败,那么另一种非常好的(也许更清晰)的测试方法是:

if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
    // $ip is valid
}

第二段代码有效地做了同样的事情(检查 filter_var 的结果是 false),尽管它以不太明确的方式这样做。

函数:filter_var() return 混合var类型,表示
String 如果效果好;
Boolean/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");
}