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";