Подтвердить что ты не робот

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

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

<?php

    $a = 1;
    $b = 2;

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

?>

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

2
sum: 3

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

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

4b9b3361

Ответ 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;

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