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


Logic used in if statement using Exclamation Mark beside function

这是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");
}