在PHP中非常奇怪的行为

时间:2016-03-07 06:26:03

标签: php

我有这段代码:

$test = 0;
if ($test == "on"){
    echo "TRUE";
}

此代码的结果将是:

TRUE

WHY ???我的PHP版本:5.4.10。

5 个答案:

答案 0 :(得分:4)

  

如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。这些规则也适用于switch语句。当比较为===或!==时,不会发生类型转换,因为这涉及比较类型和值。

$test = 0;
if ($test === "on"){
    echo "TRUE";
}

PHP会将字符串转换为要比较的数字。使用===,将比较值和数据类型。

var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true

Docs

答案 1 :(得分:4)

因为您要将$test与字符串值进行比较而不是二进制值,如果要与字符串值进行比较,请尝试使用===比较, value + dataType

在您的示例中,var_dump(0=="on");始终返回bool(true)

但是当你使用var_dump(0==="on");时,它会给你bool(false)

<强> Example from PHP Manual

var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true

答案 2 :(得分:3)

如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。这些规则也适用于switch语句。当比较为===或!==时,不会发生类型转换,因为这涉及比较类型和值。

所以使用“===”进行比较。

请参阅链接:http://php.net/manual/en/language.operators.comparison.php

答案 3 :(得分:0)

这是因为你正在做==
0是整数,因此在此on转换为int,即0 所以你的if语句看起来像0==0

对于解决方案,您必须使用===

if ($test === "on")

答案 4 :(得分:0)

在PHP中,整数和非数字字符串之间的松散比较(即不能解释为数字的字符串,例如&#34; php&#34;或者在您的情况下&#34; on&#34;)将导致字符串被解释为值为0的整数。注意数字&#34; 43&#34;,&#34; 1e3&#34;或&#34; 123&#34;是一个数字字符串,将被正确解释为数值。

我知道这很奇怪。