13

次のコードがあります。

<?php

    $a = 1;
    $b = 2;

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

?>

コードを実行すると、次のようになります。

2
sum: 3

"sum:"最初のエコーで文字列を出力できないのはなぜですか? 足し算は括弧でくくれば大丈夫そうです。

この奇妙な動作はどこかに文書化されていますか?

4

3 に答える 3

19

加算+演算子と連結演算子の両方の演算子の演算子の優先順位.は同じですが、結合されたままになっているため、次のように評価されます。

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

したがって、最初の行は最初に連結を行い、次のようになります。

"sum: 1" + 2

(これは数値コンテキストであるため、文字列は整数に変換されるため0 + 2結果は になり2ます。)

于 2012-05-31T21:02:12.600 に答える
8

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);
于 2012-05-31T21:04:08.630 に答える
1

言語構造echoを使用するため、コンマを使用して加算と連結を区切ることができます。

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

期待どおりに動作します。

于 2012-05-31T21:04:18.247 に答える