次のコードがあります。
<?php
$a = 1;
$b = 2;
echo "sum: " . $a + $b;
echo "sum: " . ($a + $b);
?>
コードを実行すると、次のようになります。
2
sum: 3
"sum:"
最初のエコーで文字列を出力できないのはなぜですか? 足し算は括弧でくくれば大丈夫そうです。
この奇妙な動作はどこかに文書化されていますか?
次のコードがあります。
<?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 operator precedenceのリストのページを見ると、連結演算子.
と加算演算子の+
優先順位が等しく、左結合性があることがわかります。これは、コードが示すように、操作が左から右に行われることを意味します。それを見てみましょう:
$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);