У меня есть следующий код:
<?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;
Работает так, как ожидалось.