PHP путается при добавлении и объединении

У меня есть следующий код:

<?php

    $a = 1;
    $b = 2;

    echo "sum: " .  $a + $b;
    echo "sum: " . ($a + $b);

?>

Когда я выполняю свой код, я получаю:

2
sum: 3

Почему не удается напечатать строку"sum:" в первом эхо? Кажется, это хорошо, когда дополнение заключено в круглые скобки.

Задокументировано ли это странное поведение где-нибудь?

 lonesomeday31 мая 2012 г., 23:16
Если на ваш вопрос ответили, вы можете принять ответ. Это помечает вопрос как решенный.

Ответы на вопрос(3)

Если вы посмотрите на страницу листингаПриоритет оператора PHPвы увидите, что оператор конкатенации. и оператор сложения+ имеют равный приоритет с левой ассоциативностью. Это означает, что операции выполняются слева направо, точно так, как показано в коде. Давайте посмотрим на это:

$output = "sum: " . $a;
echo $output, "\n";
$output = $output + $b;
echo $output, "\n";

Это дает следующий вывод:

sum: 1
2

Конкатенация работает, но вы затем пытаетесь добавить строкуsum: 1 на номер2. Строки, которые не начинаются с числа, оцениваются как0так что это эквивалентно0 + 2что приводит к2.

Решение, как вы предлагаете в своем вопросе, состоит в том, чтобы заключить операции сложения в скобки, чтобы они выполнялись вместе, а затем результат этих операций объединялся.

echo "sum: " . ($a + $b);
Решение Вопроса

Оба оператора сложения+ оператор и конкатенация. оператор имеет то же самоеприоритет оператора, но поскольку они остаются ассоциативными, они оцениваются следующим образом:

echo (("sum:" . $a) + $b);
echo ("sum:" . ($a + $b));

Итак, ваша первая строка выполняет конкатенацию первой и заканчивается:

"sum: 1" + 2

(Теперь, так как это числовой контекст, вашстрока преобразуется в целое число и таким образом вы в конечном итоге0 + 2, который затем дает вам результат2.)

 31 мая 2012 г., 23:08
@ Майкл, спасибо, что указал на это! Ответ обновлен
 31 мая 2012 г., 23:04
Technically they have equal precedence так что все сводится к ассоциативности.

Так как вы используете языковую конструкциюecho Вы можете использовать запятую, чтобы отделить дополнение от конкатенации:

echo "sum: " , $a + $b;

Работает как положено.

Ваш ответ на вопрос