PHP запутан при добавлении и конкатенации

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

<?php $a = 1; $b = 2; echo "sum: " . $a + $b; echo "sum: " . ($a + $b); ?> 

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

 2 sum: 3 

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

Является ли это странное поведение документированным?

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

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

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

 "sum: 1" + 2 

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

Если вы посмотрите на список страниц с приоритетом 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 языка, вы можете использовать запятую, чтобы отделить добавление от конкатенации:

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

Работает так, как ожидалось.