奇怪的PHP字符串整数比较和转换

时间:2012-02-13 08:50:37

标签: php string types integer

我正在研究一些数据解析代码,而我遇到了以下内容。

$line = "100 something is amazingly cool";
$key = 100;

var_dump($line == $key);

我们大多数人都希望转储产生false,但令我惊讶的是转储是true

我确实理解在PHP中存在类似的类型转换:

$x = 5 + "10 is a cool number"; // as documented on PHP manual
var_dump($x); // int(15) as documented.

但为什么我在第一个例子中提到的比较将我的字符串转换为整数而不是将整数转换为字符串。

我明白你可以对我的例子进行===严格比较,但我只是想知道:

  • PHP文档的任何部分是否提及此行为?
  • 任何人都可以解释为什么在PHP中发生?
  • 程序员如何防止此类问题?

2 个答案:

答案 0 :(得分:4)

如果我正确地重新调整PHP'强制转换'两个变量到最低可能的类型。 他们称之为类型杂耍。

尝试:var_dump("something" == 0); 例如,那会给你真实的。 。曾经咬过我一次。

更多信息:http://php.net/manual/en/language.operators.comparison.php

答案 1 :(得分:1)

我知道这已经得到了回答和接受,但我想添加一些可能有助于通过搜索找到此内容的人。

当我比较一个PHP数组中的post数组和键时,我遇到了同样的问题,在我的post数组中,我有一个额外的字符串值。

$_POST["bar"] = array("other");

$foo = array(array("name"=>"foobar"));

foreach($foo as $key=>$data){
    $foo[$key]["bar"]="0";
    foreach($_POST["bar"] as $bar){
        if($bar==$key){
            $foo[$key]["bar"]="1";
        }
    }
}

从这开始你会认为最后$foo[0]["bar"]等于"0",但发生的事情是当$key = int 0$bar = string "other"进行松散比较时结果是true为了解决这个问题,我进行了严格的比较,但是当POST数组被定义为$key = int 0时,需要将$key = string "0"转换为array("other","0");以下工作:

$_POST["bar"] = array("other");

$foo = array(array("name"=>"foobar"));

foreach($foo as $key=>$data){
    $foo[$key]["bar"]="0";
    foreach($_POST["bar"] as $bar){
        if($bar==="$key"){
            $foo[$key]["bar"]="1";
        }
    }
}

如果{bar}数组中有$foo[0]["bar"]="1",则结果为"0";如果{bar}数组中没有$foo[0]["bar"]="0",则结果为"0"

请记住,在比较变量时,由于PHP的松散变量输入,您可能无法比较变量。