PHP запутан при добавлении и конкатенации
У меня есть следующий код:
<?php
$a = 1;
$b = 2;
echo "sum: " . $a + $b;
echo "sum: " . ($a + $b);
?>
Когда я выполняю свой код, я получаю:
2
sum: 3
Почему он не может напечатать строку "sum:"
в первом эхо? Кажется, все хорошо, когда добавление заключено в круглые скобки.
Является ли это странное поведение документированным?
Ответы
Ответ 1
Оба оператора оператор сложения +
и оператор конкатенации .
имеют тот же приоритет оператора, но поскольку они оставлены ассоциативными, они получить оценку следующим образом:
echo (("sum:" . $a) + $b);
echo ("sum:" . ($a + $b));
Итак, ваша первая строка сначала выполняет конкатенацию и заканчивается:
"sum: 1" + 2
(Теперь, поскольку это числовой контекст, строка преобразуется в целое число, и, таким образом, вы получаете 0 + 2
, который затем дает вы получите результат 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);
Ответ 3
Поскольку вы используете конструкцию языка echo
, вы можете использовать запятую, чтобы отделить добавление от конкатенации:
echo "sum: " , $a + $b;
Работает как ожидалось.