php - C/PHP 中的复合 bool 表达式和变量赋值

标签 php c operators

如果标题不完全符合我的要求,请原谅我,我很难准确描述问题。

考虑以下 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->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 声称将这些表达式短路并从左到右求值,因此我希望在左侧表达式中设置的值将在右侧表达式中使用。有什么我想念的吗?

最佳答案

您现在的问题是运算符优先级。 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)

关于php - C/PHP 中的复合 bool 表达式和变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223539/

相关文章:

php - laravel - 无法在 Controller 构造函数中获取 session

c++ - C++中运算符重载的问题

php - AngularJS 表单验证 - 跳过预填充的输入字段

c - 打印目录列表时出现奇怪的指针警告

c++ - 安全蓄能器真的这么复杂吗?

c - C 中的 read() 函数错误

c++ - 在类中调用的覆盖 [] 运算符的错误版本

php - ~ 位运算符(波浪号)的作用是什么

php - 空目录错误处理

php - 将条件多次插入到 1 个表中