Составные логические выражения в C / PHP и присвоение переменных - PullRequest
0 голосов
/ 03 августа 2009

Простите, если заголовок не совсем соответствует тому, что я спрашиваю, мне трудно описать вопрос точно.

Рассмотрим следующий код 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 утверждают, что они закорачивают эти выражения и вычисляют слева направо, я ожидаю, что значение, заданное в выражениях слева, будет использоваться в выражениях справа. Я что-то упускаю?

1 Ответ

7 голосов
/ 03 августа 2009

Ваша проблема сейчас связана с приоритетом оператора. В настоящее время 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...