Y,N和0都等于0?

时间:2013-04-17 21:09:16

标签: php equality

$isClient = 0;
if($isClient == 0) echo "is client 0\n";
if($isClient == "n") echo "is client n\n";
if($isClient == "y") echo "is client y\n";

考虑上面的代码,它会输出以下内容

is client 0
is client n
is client y

我必须在这里遗漏一些东西!为什么0等于“n”和“y”???

A link to the above code for testing

3 个答案:

答案 0 :(得分:6)

在这里你进行了松散的比较( NB :在 等号的帮助下进行了严格的比较:===并且在这种情况下,字符串求值为零,因为==是左关联的,这意味着,如果第一个操作数是一个整数,则第二个操作数也是一个整数的类型(因此"n"是解释为0)。这就是PHP的工作方式。

答案 1 :(得分:4)

由于$isClient"n"属于不同的数据类型,因此必须将它们转换为通用数据类型才能进行比较。

(int)"y"(int)"n"都评估为0,因此您的平等成立。如果要进行严格比较,请使用三等号。它也会检查数据类型:

<?php

$isClient = 0;
if($isClient === 0) echo "is client 0\n";
if($isClient === "n") echo "is client n\n";
if($isClient === "y") echo "is client y\n";

?>

这会生成正确的输出:

is client 0

答案 2 :(得分:3)

在PHP中,当您想比较值时,需要使用三个等号(===),因为:

  

如关于表达式[见下文]部分所述,表达式被计算为其布尔值。如果表达式求值为TRUE,PHP将执行语句,如果计算结果为FALSE - 它'我会忽略它。有关哪些值评估为FALSE的更多信息,请参阅“转换为布尔值”部分。 (Source)

  

值得一提的最后一件事是表达式的真值。在许多事件中,主要是在条件执行和循环中,您对表达式的特定值不感兴趣,而只关心它是表示TRUE还是FALSE。常量TRUE和FALSE(不区分大小写)是两个可能的布尔值。 必要时,表达式会自动转换为布尔值。有关如何使用的详细信息,请参阅有关类型转换的部分。 (Source)

所以你的代码必须修改如下:

$isClient = 0;
if($isClient === 0) echo "is client 0\n";
if($isClient === "n") echo "is client n\n";
if($isClient === "y") echo "is client y\n";

输出

is client 0