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

Ger*_*der 162 php comparison operators comparison-operators

昨天我在修改其他人编写的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");
?>
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

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)
Run Code Online (Sandbox Code Playgroud)

运算符似乎适用于布尔和整数变量,但不适用于字符串.我==!在PHP文档中找不到或在任何搜索引擎上找到任何关于它的东西(试过Google,Bing,DuckDuckGo,但我怀疑他们试图解释它而不是搜索文字字符串).以前是否有人看过这个并且可以对这种行为有所了解?

Ban*_*Dao 242

不同之处在于没有操作员==!.

这个表达式:

$a ==! $b
Run Code Online (Sandbox Code Playgroud)

与此基本相同:

$a == (!$b)
Run Code Online (Sandbox Code Playgroud)

  • 哇,在如此短的时间内得到了很多好的答案.我选择了第一个澄清的答案!适用于右手变量,因此具有最大价值.对不起,其他人;) (10认同)
  • @Gerald Schneider:至少你可以做的就是改善这个答案,以便它在语法和格式方面至少与其他答案相提并论(其中一个你特别提到它的非常详细的解释) !).但无论如何,我现在已经编辑过了. (4认同)
  • @Bang Dao嗯,JavaScript?它有===和!==.但没有==! (2认同)
  • @BangDao现在你找到[w3fools]的另一个原因(http://w3fools.com/)请阅读它,这很重要. (2认同)

bla*_*d Ψ 77

==!PHP中没有运算符

它只是一个组合==!.这里只有相关的操作员==.所以组合==!将正常==,检查Equality,并相信我,

$variable_a ==! $variable_b 
Run Code Online (Sandbox Code Playgroud)

不是别的

$variable_a == (!$variable_b)
Run Code Online (Sandbox Code Playgroud)

因此;

"a" ==! " ": bool(false)
"a" ==! "a": bool(false) //is same as "a" == (!"a")
Run Code Online (Sandbox Code Playgroud)

true ==! false: bool(true)
true ==! true: bool(false)
Run Code Online (Sandbox Code Playgroud)

组合多个运算符字符可能无法始终作为运算符.例如,如果我们采用=!,它将仅作为运算符工作,如果它是!=或的模式!==.可以有这些字符像许多组合 !====,!==!等等.等等.运营商的组合应该是唯一的格式,独特的订单,独特的组合(所有的字符不会与所有其他字符组合)和肯定,他们之间没有任何空间.

检查下面的运营商列表;

在此输入图像描述

  • 我陷入了能够使用`<table>`的错觉. (2认同)

Mic*_*gue 38

==! 不是运营商,而是两个:

==!

! 优先级高于 ==

所以:

"a" !== " ": bool(true) - > true因为"a"实际上不等于""

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

可以用==和!之间的空格写.


F.P*_*F.P 29

==!不存在.这是一个有点神秘的符号== !

由于空格在这些操作中无关紧要,您可以轻松编写a --> b,评估为a-- > b,但看起来很奇怪.

所以,至于问题:"a" ==! " "将被解析为"a" == !" ".字符串的否定是由覆盖铸造,这意味着任何字符串,但"0"" "是,铸造时true.

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

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

并且,由于string "a"不同bool true,这将评估整个表达式false.

那么,这个故事的寓意是什么?不要因丢失或错误的放置空间而让自己感到困惑!:)

  • 与此答案中所述不同,"a"== true的计算结果为true,因为非空字符串被转换为布尔值true.表达式"a"=== true将评估为false. (3认同)

AD7*_*six 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)
}
Run Code Online (Sandbox Code Playgroud)