在if语句中组合赋值和相等时的奇怪结果(PHP)

时间:2012-09-19 04:46:57

标签: php debugging

在CentOS上的PHP 5.3.10中测试。

在脚本中运行:

$test = "62 3/4";

if($pos = strpos($test,' ') !== false) {
  $test= substr($test,0,$pos); // use $pos
}
// $test is "6"

在我运行的另一个独立脚本中:

if($pos = strpos($test,' ') !== false) {
  $test = substr($test,0,strpos($test,' ')); // redo substr calculation
}
// $test is "62"

$ pos应该是2(第三个字符是一个空格,从零开始,0,1,2),所以$ test都应该是“62”,不是吗?

3 个答案:

答案 0 :(得分:3)

运营商优先权! !==出现在=之前,因此测试有效地变为

if($pos = (strpos($test,' ') !== false))

将评估为true或false,而不是字符串位置。

始终使用明确的parens:

if(($pos = strpos($test,' ') !== false)

答案 1 :(得分:1)

你想要

if( ($pos = substr($test, ' ')) !== false ) {
    // ...
}

请参阅PHP Operator Precedence

答案 2 :(得分:0)

还要考虑在你的第二个if中,变量$ test的值已经被第一个改变了:$ test = substr($ test,0,$ pos);