"!==和==!之间的区别"

163

昨天当我修改别人编写的PHP代码时,我遇到了这个问题。我惊奇地发现一个简单的比较(if ($var ==! " "))没有按预期工作。经过一些测试,我意识到编写该代码的人使用了==!而不是!==作为比较运算符。我从未在任何语言中看到过==!,所以我想知道这段代码怎么可能会起作用,并进行了一些测试:

<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>

执行此代码将产生以下输出:

int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)

这个运算符似乎适用于布尔型和整型变量,但不适用于字符串。在PHP文档中我没有找到==!的内容,也没有在任何搜索引擎上找到相关信息(尝试了Google、Bing、DuckDuckGo,但我怀疑它们会解释而非搜索该字面字符串)。有人遇到过这种情况并能对此行为进行解释吗?


58
加油,赞怎么了?我可以再出十几个类似的问题,并附上半正式的分析。这是标准的教科书练习,不是吗?在Stack Overflow上,我们投票是为了质量和信息,而不是为了娱乐和乐趣。 - sehe
51
@sehe之所以得到赞,是因为这是一个充分研究的问题定义 - 他已经"彻底寻找答案"、"明确具体",问题"与他人相关"且"与主题相关"。提问者尝试了一些方法并向我们展示了他尝试过的内容;这是该网站试图培育的类型问题。 - JRaymond
12
他之所以得到赞,是因为这是一个非常易于理解的问题和答案的琐事题。琐事方面增加了好奇心,从而吸引更多人参与,而易懂的方面则提高了那些足够理解问题和答案并投票的人的比例。这与它是否是一个好问题无关。 - Andreas Bonini
4
@JRaymond,承认吧,大部分得到高赞的问题都是琐碎的小问题。看看我其中的这三个问题及其他许多问题:123。它们都不是你可以在谷歌上轻松找到的内容(与大多数得到高赞的问题不同),而且在写出来之前已经被深思熟虑并尝试过了(我知道,因为我写了它们)。然而,由于这些问题需要专业知识,所以它们从来没有得到很高的票数。这就是这里的系统运作方式。 - Shahbaz
3
@JRaymond 是正确的。作家们可以在SO上大有作为。我建议按照这个列表(http://php.net/quickref.php)列出一些有趣的问题,其中函数是解决方案。情境或函数越深奥有趣,得票就越多。 - Mike B
显示剩余7条评论
5个回答

244

区别在于没有运算符==!

这个表达式:

$a ==! $b

基本上与这个一样:

$a == (!$b)

10
哇,短时间内有很多好答案。我选择了第一个澄清“!”应用于右手变量并因此具有最大价值的答案。抱歉其他人;) - Gerald Schneider
4
@Gerald Schneider:你至少可以通过改进这个答案的语法和格式,使其达到其他答案的水平来弥补错误。其中一个答案你还特别指出了它的非常详细的解释!但无论如何,我已经编辑过了。 - BoltClock
可能是因为你不会编写PHP代码,所以你这样说。PHP有 ===!== 这两个操作符,在其他语言中并没有出现过(据我所知)。 - Bang Dao
2
@Bang Dao Um,JavaScript?它有 === 和 !==。但没有 ==! - psr
2
@BangDao 现在你找到了w3fools的另一个原因,请阅读它,这很重要。 - some
显示剩余2条评论

77

PHP中没有==!运算符

这只是==!的组合。 这里唯一相关的运算符是==。 所以组合==!将像普通的==一样工作,检查相等性,相信我,

$variable_a ==! $variable_b 

无非就是

$variable_a == (!$variable_b)

因此;

"a" ==! " ": bool(false)
"a" ==! "a": bool(false) //is same as "a" == (!"a")

并且

true ==! false: bool(true)
true ==! true: bool(false)

将多个运算符字符组合在一起可能不会作为一个运算符工作。例如,如果我们采用=!,它只有在!=或者!==的模式下才能作为运算符使用。这些字符可以有无数种组合,比如!====!==!等等。运算符组合应该是唯一格式唯一顺序唯一组合(所有字符都不能与其他字符组合),并且绝对不应该在它们之间加上任何空格

检查下面的运算符列表:

enter image description here


2
我曾经也有过同样的幻想,觉得可以使用 <table> - Chad Harrison
几乎以为那是一个表格...但实际上它是一张图片。 - Baba

39

==! 并非一个运算符,而是由两个运算符组成:

==!

! 的优先级比 == 要高。

所以:

"a" !== " ": bool(true) --> true,因为 "a" 真的不等于 " "

"a" ==! " ": bool(false) --> false,因为 "a" 不等于 !" "

可以在 == 和 ! 之间加上空格。


1
false 是因为 "a" 不等于 !" "。 !" " 表示将其转换为布尔类型并取反,因此 " " 为 true,!"" 为 false。 - Zaffy
@quarry 是的,我没有深入解释太多 :p - Michael Laffargue

29

==!并不存在。它是== !的一种略微晦涩的表示方法。

由于这些操作中空格不重要,因此您可以轻松地写出a-->b,它将评估为a-- > b,但看起来很奇怪。

所以,对于问题:"a" ==! " "将被解析为"a" ==!" "。字符串的否定是通过转换实现的,这意味着任何字符串但"0"" "在进行类型转换时都会被视为true

因此,表达式"a" ==!" "将被转化为:

  1. "a" ==!" "
  2. "a" ==!false
  3. "a" ==true

由于string "a"bool true不同,因此整个表达式的值为false

那么,故事的寓意是什么?不要让自己被缺少或错误放置的空格所迷惑!:)


3
与这个回答中所说的不同,“a == true” 的计算结果是 true,因为非空字符串会被转换为布尔值 true。而表达式 “a === true” 的计算结果是 false。 - Pascal Rosin

25

==! 不是一个运算符

==! 在 PHP 中根本不是比较运算符 - 它与 == ! 相同(请注意空格)。

也就是说:

if ("a" !== " ") {
    // evaluates to true - "a" and " " are not equal
}

if ("a" == !" ") {
    // unreachable
} else {
    // evaluates to false - "a" is not equal to true (!" " evaluates to true)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接