【问题标题】:Why did the obvious type mismatch return early?为什么明显的类型不匹配会提前返回?
【发布时间】:2014-02-22 21:05:15
【问题描述】:

PHP/5.5.6

谁能给我解释一下,为什么如果我将一个变量分配为一个字符串,然后将所述字符串转换为一个 int,然后将它与一个字符串的原始值进行比较,那么下面的情况会返回一个 true 吗?

arrayOfValues 是一个整数数组,例如 -1、0、0、2、1...等

function getScore($arrayOfValues){

  $result = 'N/A';

  foreach($arrayOfValues as $item){
    if($item > 0) { $result = 0; break;}
  }

  echo $result;   // outputs 0
  if($result == 'N/A') { return -1; }   //code here passes. WHY?
  echo $result;   // outputs never makes it
  // CODE DOES based upon values calculate score

  return $result;
}

在类中调用所述函数具有以下内容

echo $foo->getScore($array);    // outputs -1

如果我将函数中的逻辑更改为 $result = -1 并且检查为 $result

【问题讨论】:

标签: php


【解决方案1】:

因为

0 == 'N/A'

Here你可以阅读:

如果您将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为数字,然后 数值比较

像这样修复它:

if ($result === 'N/A') ...

解释(来自手册中的同一位置):

当比较为 === 或时,类型转换不会发生 !== 因为这涉及比较类型和值

【讨论】:

  • 你是说在 PHP 中双 == 就像一个 = 吗?我也不想修复,我想要一个解释。
  • 没有。同时,我添加了手册中的一些文字和链接
  • 感谢您的参考。我发现这很有趣,因为我在那里的逻辑是有效的,但现在突然不行了。可能是我删除了一个 = 并且从未注意到它。必须回到 svn 并仔细检查。
  • 还有一个问题,如果我将字符串 N/A 转换为 int,0 == 'N/A' 会是 0 吗?还是我声明 0 等于 N/A ?我注意到文档中的第一个示例 var_dump(0 == "a"); // 0 == 0 -> 真。
  • 是的,如果你将"N/A" 转换为一个数字,你会得到0。如果将"3.14ABC" 转换为数字,则会得到3.14,依此类推。当比较的任一操作数是数字,或者两个操作数都是数字字符串时(这意味着"2.0" == "2"),就会转换为数字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多