Php 奇怪的行为:(0==“string”为真|开关(0){}给出第一种情况';案例;“a”字:';
怎么会发生 这也符合逻辑:Php 奇怪的行为:(0==“string”为真|开关(0){}给出第一种情况';案例;“a”字:';,php,Php,怎么会发生 这也符合逻辑: 0=="some string" (string)0=="some string" "0"=="some string" false 它被称为,并且是一种语言特性(据我所知,每种松散类型的语言)。比较运算符需要两个相同类型的值。如果没有相同的类型,PHP会尝试将这两种类型转换为最常见的类型,即int。这意味着 0=="some string" 0==0 true 太长;我没读过 在这篇相当长的文章中总结这一点;发生从一种
0=="some string"
(string)0=="some string"
"0"=="some string"
false
它被称为,并且是一种语言特性(据我所知,每种松散类型的语言)。比较运算符需要两个相同类型的值。如果没有相同的类型,PHP会尝试将这两种类型转换为最常见的类型,即int
。这意味着
0=="some string"
0==0
true
太长;我没读过
在这篇相当长的文章中总结这一点;发生从一种类型到另一种类型的隐式转换,如果不希望发生这种情况,请使用更严格的==
或显式转换
包括两者的例子可以在这篇文章的后面找到
可在手册的相关章节中找到有关类型转换的更多信息。
世界会结束吗,是PHP解释器在骗我吗? 不太可能,尽管乍一看这可能出乎意料,但它实际上是该语言的一个特性(类型转换),并且在其他情况下通常非常有用 当比较不同类型的对象时,PHP解释器需要找到一个共同点,如果它们是不同类型的,那么它自然会隐式地尝试将一个转换为另一个
在本例中,它将尝试将字符串“string”转换为数字值 下面这一行相当于您在问题中的内容:
if (0 == intval ("string"))
嗯,等等。。嗯,什么!? 由于从“字符串”到数值的转换实际上是不可能的,因此隐式转换将产生
0
(由语言指定)
它是将转换为int的字符串,因为这是PHP
委员会决定
这主要是因为这样的隐式转换将有助于进行数学运算
这种行为比另一种方式更常见
周围
我们知道,比较0
和0
应该比较true
,而这正是正在发生的事情。下面的内容相当于您在问题中的内容,不过进一步解释会更加冗长
function equal_ ($lhs, $rhs) {
if (gettype ($lhs) == 'integer')
$rhs = intval($rhs);
/* ... */
return $lhs === $rhs;
}
if (equal_ (0, "string")) {
}
但是嘿。。嘿,等等! “当我使用开关时,我甚至没有调用任何比较运算符,该示例发生了什么?” 不需要,但在执行switch语句时,解释器的内部将发生变化 为了解决这个问题,您需要显式地强制转换您正在搜索的针,或者用作标签的值,以便它们具有相同的类型 您以前的代码片段可以按如下方式编写,以便进行更严格的比较
switch((string)0) {
case "a":
echo "a";
break;
case "b":
echo "b";
break;
default:
echo "def";
break;
}
如果我不想使用这个“功能”,我该怎么办? 由于PHP4有一个更严格的比较运算符<代码>==
function strict_equal_ ($lhs, $rhs) {
if (gettype ($lhs) != gettype ($rhs))
return false;
return $lhs == $rhs;
}
if (strict_equal_ (0, "string"))
echo "True";
else
echo "False";
这将不允许对其中一个操作数进行隐式转换,而是首先检查操作数是否为相同类型(如果不是);它将返回false
只有当它们属于同一类型时,它才会真正比较两者,下面的函数在许多方面等同于使用==
function strict_equal_ ($lhs, $rhs) {
if (gettype ($lhs) != gettype ($rhs))
return false;
return $lhs == $rhs;
}
if (strict_equal_ (0, "string"))
echo "True";
else
echo "False";
在比较这两种类型之前,PHP将字符串转换为int。在比较int和string时,您应该小心。为什么将它们转换为int而不是string?@2astalavista For comparison PHP总是向下转换。这允许进行比较,如
“”==false
(在if(!$inputText)
中非常有用),或2==“2只鸡”
。值得注意的是,还有一个类型安全比较运算符(通常称为“身份比较”)===
((0==“some string”)==true
,但是(0==“some string”)==false
)@2astalavista请参阅我的帖子,以了解更深入的解释和严格比较运算符=
。请参阅“在本例中,它将尝试将字符串“string”转换为一个数字值。”-为什么不将int转换为string?@2astalavista读取“嗯,等等……嗯,什么!?”下的内容,然后您将找到您的答案。“按照语言的规定”-您能否显示它的指定位置,请@2astalavista在这里读一下,如果一个整数值被分配给$var,它就会变成一个整数。这就是那个部分,对吗?
switch((string)0) {
case "a":
echo "a";
break;
case "b":
echo "b";
break;
default:
echo "def";
break;
}
function strict_equal_ ($lhs, $rhs) {
if (gettype ($lhs) != gettype ($rhs))
return false;
return $lhs == $rhs;
}
if (strict_equal_ (0, "string"))
echo "True";
else
echo "False";