PHP is confused when adding and concatenating

人盡茶涼 提交于 2019-12-17 02:51:32

问题


I have the following code:

<?php

    $a = 1;
    $b = 2;

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

?>

When I execute my code I get:

2
sum: 3

Why does it fail to print the string "sum:" in the first echo? It seems to be fine when the addition is enclosed in parentheses.

Is this weird behaviour anywhere documented?


回答1:


Both operators the addition + operator and the concatenation . operator have the same operator precedence, but since they are left associative they get evaluated like the following:

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

So your first line does the concatenation first and ends up with:

"sum: 1" + 2

(Now since this is a numeric context your string gets converted to an integer and thus you end up with 0 + 2, which then gives you the result 2.)




回答2:


If you look at the page listing PHP operator precedence, you'll see that the concatenation operator . and the addition operator + have equal precedence, with left associativity. This means that the operations are done left to right, exactly as the code shows. Let's look at that:

$output = "sum: " . $a;
echo $output, "\n";
$output = $output + $b;
echo $output, "\n";

This gives the following output:

sum: 1
2

The concatenation works, but you then try to add the string sum: 1 to the number 2. Strings that don't start with a number evaluate to 0, so this is equivalent to 0 + 2, which results in 2.

The solution, as you suggest in your question, is to enclose the addition operations in brackets, so they are executed together, and then the result of those operations is concatenated.

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



回答3:


Since you use the language construct echo you can use a comma to separate the addition from the concatenation:

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

Works as expected.



来源:https://stackoverflow.com/questions/10841124/php-is-confused-when-adding-and-concatenating

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!