3

今日、職場で、理解できないコード行に行き詰まりました。私は JavaScript に関数を持っていました。一意のタイムスタンプを確実に取得するために、その醜いループが行われました。

var ts = +new Date();
while (ts === (ts = +new Date()));

値が変わるまで ts を再設定していることは明らかだと思います。

しかし、関数をPHPコードに移行しようとしたとき-そのように:

$ts = preg_replace('/^\d\.(\d+)\s(\d+)$/', '$2$1', microtime());
//regex extracts digits and re-positions them - ugly microtime :(
while ($ts === ($ts = preg_replace('/^\d\.(\d+)\s(\d+)$/', '$2$1', microtime())));

インタプリタは無限ループに入ります。私の試みはすべて、比較の前に $ts 代入が行われていることを示しているように見えましたが、なぜ左側の式が最初に解決されないのか理解できません。私の PHP に関する知識は JavaScript ほど大きくはないので、私が漏らしている PHP の式とステートメントに関する重要なヒントがあるかどうか疑問に思っています。

アドバイス: 「適切に構成された」ループを作成してコードを修正したくありません。解決策は明らかです。ここで何が起こっているのかを理解したいと思っています。すべての助けに感謝します。

4

2 に答える 2

1

PHP では、比較を行う前に、割り当てを最初に評価する必要があります。通常、代入演算子の優先順位は非常に低いため、 を記述$a = $b + $cすると、結果が $a に代入される前に加算が最初に計算されます。ただし、これは特殊なケースであり、十分に文書化されていないように見えますが、同様のケースがドキュメントにあり、次のように述べられています。

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

したがって、この場合、PHP は、代入の結果を無効にする前に、代入を実行する必要があると判断します。ここでも同様のことが起こっていると思いますが、PHP は後で割り当てを行うことができるはずです。

実際には、他の式の場合と同様に、結果は予測できない場合があります。

// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
于 2012-11-21T22:52:46.647 に答える
1

PHP は比較の前に代入を評価し$ts ===ます$ts =。簡単な修正は次のとおりです。

$ts = preg_replace('/^\d\.(\d+)\s(\d+)$/', '$2$1', microtime());

//regex extracts digits and re-positions them - ugly microtime :(
while ($ts === ($ts2 = preg_replace('/^\d\.(\d+)\s(\d+)$/', '$2$1', microtime()))) {
    $ts = $ts2;
}

また、PHP には、似たようなことを行う uniqid() という便利な関数があります。毎回一意の文字列を提供します。

于 2012-11-21T22:41:47.553 に答える