1

私は答えようとしていたのですが、なぜこのコードは無限ループなのですか?

問題は操作の優先順位が原因である可能性があると考えましたが、http://php.net/manual/en/language.operators.precedence.phpを確認すると.=

だから私は次のコードを試しました:

 $a.$b = "test";

 echo $a;
 echo $b;

そして、未定義の変数を取得aしましtestた。これは、$b に値を代入していることを意味します。$b に値を代入するにはどうすればよいですか (操作の優先順位に従ってはいけません)

4

2 に答える 2

3

答えはドキュメントに明確に記載されていると思います:

= は他のほとんどの演算子よりも優先順位が低くなりますが、PHP では次のような式を使用できます: if (!$a = foo())。この場合、 の戻り値foo()は に入れられ$aます。

Jon's answerを拡張すると、式に割り当てることができないため、=が優先され、インタープリターは次のステートメントを認識します。

$a.($b = "test");

したがって、それらは 2 つの別個の式になり、それぞれ独自の優先順位に従います。したがって、testに割り当てられ$bます。

これを証明するために、別の割り当てを追加します。

$a = 'my ';
$c = $a.$b = "test";

var_dump($a); // string(3) "my "
var_dump($b); // string(4) "test"
var_dump($c); // string(7) "my test"
于 2013-07-25T12:04:39.887 に答える
3

これは意味がありません:

($a.$b) = "test"; // you can't assign to the result of an expression

これは次のことを行います。

$a.($b = "test");

これ以上深く掘り下げなくても、PHP コンパイラーは、「それが機能する」という理由で、後者を作成したかのようにコードを解釈すると思います。

PHP パーサーの欠陥が「滲み出て」コードに驚くべき影響を与えるのは、これが初めてではありません。

更新:これはバグではなく、機能であることが判明しました。

于 2013-07-25T11:57:36.650 に答える