質問: 0; echo "1 となります: " . ++$count; echo "1 となります: " . $count; ``` こうだとすれば、ページを訪問し続けると、 $count++も同じく「1回目の訪問」「2回目の訪問」「3回目の訪問」... となりませんか?++$countで正しく動作するのは理解できるのですが、$count++で何度訪問しても1回目になる理由がわかりません。 以下の認識は正しくないでしょうか? ``` $count++の場合。まず最初のcount++は0を返す。$countには1が代入される。 そして「1回目の訪問」と出力。 二回目の訪問では$countには1が入っているので、$count++は1を返す。 そして$countには2が代入される。 そして「2回目の訪問」と出力 $++countの場合。まず最初のcount++は1を返す。$countには1が代入される。 そして「1回目の訪問」と出力。 二回目の訪問では$countには1が入っているので、$count++は2を返す。 そして$countには2が代入される。 そして「2回目の訪問」と出力 ``` 細かかくてすみません。教えていただけると幸いです。
回答: PHP に限らず、インクリメント演算子 (加算子) やデクリメント演算子 (減算子) を使った場合の典型的な誤りですね。こういう見つけにくいバグを産むからインクリメント演算子の使用を極力禁じる流派もあるくらいです。特に今回のケースのように、スタック外と値のやりとりをする副作用がある場合では使わないほうが無難です。賢い記述に見えて、潜在的なバグを増やす原因です。 前置加算子 `++$count` は、評価時に `$count` の値を 1 増やしてから `$count` の値を返します。通常、変数の値を変更するの (副作用) は明示的に代入が必要です。加算子は、暗黙的に代入がなされる、かなり**特殊**な性質を持つ演算子です。 模式的には、 ``` $set = setcookie("visitedCount", ++$count, time()+60*5); ``` は ``` $count += 1; $set = setcookie("visitedCount", $count, time()+60*5); ``` と同じです。 後置加算子は、`$count++` は、評価時に `$count` の値を返した**あと**で `$count` の値を 1 増やします。 ``` $set = setcookie("visitedCount", $count++, time()+60*5); ``` は、 ``` $set = setcookie("visitedCount", $count, time()+60*5); $count += 1; ``` と同じ、ということです。(正確には`$set` への代入文の評価より先に `$count` への代入がなされるのでまったく同じというわけではない。) まあ、早い話が、`for ($i = 0; $i < 5; $i++)` みたいなイディオム以外のところでは、`++` は使わず、`+= 1` を使うといいよ、ということです。