sum — PHP сбит с толку при добавлении и объединении

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

<?php

$a = 1;
$b = 2;

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

?>

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

2
sum: 3

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

Задокументировано ли это странное поведение где-нибудь?

13

Решение

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

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

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

"sum: 1" + 2

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

18

Другие решения

Если вы посмотрите на страницу листинга Приоритет оператора 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);
8

Так как вы используете языковую конструкцию echo Вы можете использовать запятую, чтобы отделить дополнение от конкатенации:

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

Работает как положено.

1
По вопросам рекламы [email protected]