PHP函数返回0与false的区别

3
我有一个PHP函数,它返回一个可以为零或更大的数字。例如:
public function returnVal($val1, $val2) {
  if ($val2 > $val1) return $val2 - $val1;
  else return false;
}

这被用作:

if ($diff = $this->returnVal($a, $b)) // do something
else // don't

但是当差异为零时,我仍然希望它执行某些操作,但似乎将零检测为假而不是零。尽管如此,我仍然需要知道它何时为假。
我尝试将其更改为:
if (($val2 - $val1) == 0) return 'zero';
if ($val2 > $val1) return $val2 - $val1;
else return false;

这种方法是可行的,但看起来不太优雅-肯定有更好的方法吧?

谢谢


$diff = $this->returnVal($a, $b); if ($diff !== false) // do something else // don't - Mark Baker
1
将您的测试包装在 is_int() 中,或者使用常见的丑陋的 !== false 检查。 - mario
1个回答

5

使用if语句中的变量赋值快捷方式时,PHP会使用松散类型比较并将像0null和其他假值的东西转换为false。您必须使用显式的===!==比较来确保比较的是完全相同的类型(进行类型转换):

$diff = $this->returnVal($a, $b);
if ($diff !== false) // do something
else // don't

点击这里查看使用简单的===!=进行比较可能出现的所有比较条件。

@MrLlama提供的另一种方法:

if (($diff = $this->returnVal($a, $b)) !== false) // do something
else // don't

啊,好的,我以前用过 ===,但是结果有些奇怪,可能是因为没有返回正确的类型。我想我也试图在不分配到临时变量的情况下完成它,但是刚刚测试了一下,它可以工作,非常感谢 :) - stukerr
@stukerr 没关系!希望文档的参考能为你解决一些问题。在适当的时间过去后,请确保将最有帮助的答案标记为已接受。 - sjagr
2
你也可以使用 if (($var = func($a, $b)) !== FALSE),但这样不够简洁。 - Mr. Llama
@Mr.Llama 是的,除非很简单,否则我更喜欢避免使用那种快捷方式。 - sjagr
感谢@Mr.Llama - 知道最短的方法总是很好。 - stukerr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接