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