请原谅我,如果标题与我提出的标题不完全一致,我很难准确地描述这个问题。
考虑以下PHP代码:
#!/usr/bin/php
<?php
class foo{
function bar()
{
return true;
}
}
if (true && $a = new foo() && $a->bar()) {
echo "true";
} else {
echo "false";
}
它给出了
Fatal error: Call to a member function bar() on a non-object
表示$ a-&gt; bar();表达
考虑以下C代码:
int main(void)
{
int i = 0;
if (i += 1 && printf("%d\n", i))
{
printf("Done: %d.\n", i);
}
}
输出:
0
Done: 1.
这是为什么?由于C和PHP声称要将这些表达式短路并从左到右进行求值,因此我希望在左边的表达式中设置的值设置在右边的表达式中。有什么我想念的吗?
答案 0 :(得分:7)
您现在的问题是运营商优先级。 PHP目前正在评估您的PHP语句:
if (true && $a = ( new foo() && $a->bar() ) )
在这种情况下,您尝试拨打$a
时未定义$a->bar()
。
你真正想要的是:
if (true && ( $a = new foo() ) && $a->bar())
在复杂条件下使用括号可以防止发生这类错误。
编辑:证明
if(true && $a = true && false) { }
var_dump($a); // bool(false)
if(true && ( $b = true ) && false) { }
var_dump($b); // bool(true)