类型转换和与松散运算符“==”的比较

时间:2011-07-13 14:20:27

标签: php casting comparison

我有一个令我困惑的问题。我之前注意到了这一点,但直到今天才注意到它。 我试图编写自己的整数字符串检查。我知道is_numeric(),但这还不够,因为它将float计为数字integersis_int()不会对字符串数字起作用。

我做了类似的事情


$var1 = 'string';
$var2 = '123'; 

var_dump( (int)$var1 == $var1);// boolean true 
var_dump((int)$var2 == $var2);// boolean true

 var_dump((int)$var1);//int 0
 var_dump($var1);//string 'string' (length=6)

正如预期的那样,第二个var转储输出为true,因为我期望使用php的松散比较,字符串和整数版本相等。

然而,第一次,我不明白为什么会这样。我尝试过投射到bool,它仍然给我相同的结果。

我尝试将cast var分配给一个新的变量并比较两者,结果仍然相同

这是我做错了还是php错误?

***注 我不是在这里比较类型。我实际上是想利用int 0不等于string 'string'的事实。

我用不同的方式编写了整数检查,所以我真的不需要替代方案。

***编辑 我做了一些额外的检查,结果证明0 == 'string'也是如此。怎么可能?

***编辑2 这个问题下面有多个正确的答案。感谢所有回答的人。

7 个答案:

答案 0 :(得分:7)

这不是错误,它是功能。任何字符串都可以转换为整数,但是the cast will return 0 if the string doesn't start with an integer value.此外,在比较整数和字符串时,the string is casted to an integer and then the check is done against the two integers。由于该规则,任何随机字符串都“等于”为零。 (要绕过此行为,您应该使用strcmp,因为它通过转换传递给字符串的任何内容来执行显式字符串比较。)

为了确保我正在处理整数,我首先使用is_numeric,然后将字符串转换为int,并验证stringified int是否对应于输入值。

if (is_numeric($value) && strcmp((int)$value, $value) == 0)
{
    // $value is an integer value represented as a string
}

答案 1 :(得分:2)

根据php.net http://php.net/manual/en/language.operators.comparison.php

var_dump(0 == "a"); // 0 == 0 -> true

所以,我认为它是杂乱的类型,并实际上将双方都转换为int。然后比较字符串中ascii值的总和或每个相应索引的ascii值。

答案 2 :(得分:2)

首先在数学'='中称为传递b / c(A = B且B = C => A = C)是有效的。

PHP不是“==”!

(int)$var1 == $var1

在这种情况下,PHP会将'string'强制转换为0 - 这是一种惯例。

然后== - 运算符将隐含地将第二个操作数'string'也转换为整数 - >以及0。

这导致了真实。

答案 3 :(得分:2)

您的帖子出错,正确的输出是:

bool(true)
bool(true)
int(0)
string(6) "string"

这是怎么回事:

  1. 因为您将变量转换为整数,并将其与具有松散比较==的整数进行比较,PHP将首先隐含地将字符串转换为整数,更明确但100%等效的形式将是:if((int)$var1 == (int) $var1)
  2. 见1),同样适用于此
  3. 它会打印int(0),因为它无法解析数字,而是会返回0
  4. 打印string(6) "string" - 按预期

答案 4 :(得分:1)

如果您想比较变量类型,您应该使用===

答案 5 :(得分:1)

  

注意:此答案是对a related question about the Twig template engine的回复,已标记为重复,并在此重定向。

     

由于背景不同,此答案将提供给SO社区的成员,他们可能会受益于与专门相关的其他详细信息。

     

TL; DR :请参阅此帖子How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?

问题

上下文

  • Twig模板引擎(截至2017年3月27日星期五的最新版本:12:25)

方案

  • DeveloperYlohEnrohK在twig表达式中使用比较运算符
  • DeveloperYlohEnrohK在使用相等比较运算符时注意到意外结果

问题

  • 为什么相等比较运算符(==)会在Twig中产生意外结果?
  • 为什么以下产生不同的结果?

    {{ dump(0 == 'somekey') }}          ==> true
    {{ dump(0|lower == 'somekey') }}    ==> false
    

解决方案

陷阱

  • 在撰写本文时,Twig模板引擎不支持===与标准PHP相同
  • Twig确实可以替代=== using same as
  • 因此,这个well-known circumstance的处理在PHP和Twig之间略有不同。

另见

答案 6 :(得分:0)

这是一个更严格地测试int或整数字符串的函数。

function isIntegerNumeric($val) {
  return (
    is_int($val)
      || (
        !is_float($val)
          && is_numeric($val)
          && strpos($val, ".") === false
      )
  );
}

它相对较快,并且如果没有必要,可以避免进行任何字符串检查。