質問: 私が使用しているブログは php で構築されているのですが、 cookie を使って設定を保存する処理をしているところで、 ``` $_COOKIE[FOO]=''; if($_POST['set_cookie']) { $_COOKIE[FOO].='value'; } if($_COOKIE[FOO]){ hoge; } ``` というコードが書かれています。 このコードの意図がよく分からないのですが、コード通りに解釈すると、 1)フォームの「設定保存」ボタンが押されると、 set_cookie が post される。 2)set_cookie が post されてきたら、$_COOKIE に保存されている cookie 名 FOO に値 'value' を追加する。 3)その上で、もし cookie 名 FOO に何らかの値がセットされていたら、 hoge を実行する。 という流れになっています。 疑問なのは、 $_COOKIE は cookie に設定された値を取り出すことのできるスーパーグローバル変数ですが、 cookie に値をセットするために上のように代入してよいのか?ということです。 私の予想では、代入しても $_COOKIE に値はセットされず、 cookie に値はセットされず、 setcookie() を使う必要があると思うのですが、実際に試したところ、値自体はこのスーパーグローバル変数にセットできるようです。でも、そうしたところで、 cookie を更新してくれるようには思えませんし、勝手に代入して値を変更してよいものかどうか疑問です。 ネットで php のリファレンスサイトなどを検索してみましたが、 $_COOKIE に値を代入する例や、代入した場合結果どのようなことが起こるかを説明したサイトが皆無でしたので、質問させてください。 current latest version である PHP7 での言語仕様として、上記操作を行った時の「正しい動作」は、どうなるのだと定義されているのでしょうか。
回答: > > current latest version である PHP7 での言語仕様として、上記操作を行った時の「正しい動作」は、どうなるのだと定義されているのでしょうか。 > > > スーパーグローバル変数はスコープの広い変数なので、他の変数と同じ挙動をする。 というのが定義で、$_COOKIEに関してだけ(他のスーパーグローバル変数もですが)代入時の挙動を定義したドキュメントというのは存在しないと思います。 > > このコードの意図がよく分からないのですが、コード通りに解釈すると、 > > > `set_cookie()`してもそのリクエスト中には$_COOKIEの値は変更されないので、 $_COOKIEを$_SESSIONと同じ様に扱いたい時や一時変数を使いたくない時にこういう書き方をすることがあります。 多分、処理`hoge`の最後で$_COOKIEの内容を全部`set_cookie`してるんじゃないかなと想像します。