質問: いつも勉強させていただいております。 現在Zend Framework2を利用してPHPの勉強をしている学生です。 もしよければ質問させてください。 画面Aから画面Bへ移動する際、画面Aで利用した値をBでも利用したいと思い、クラスにプロパティを定義してそこに入れるようにしました。($this->propertyのように) しかし画面Aで入れた値が画面Bでは消えてしまっていました...。GETやPOSTで次の画面へ渡すことはできたのですが、PHPではプロパティに入れて保持しておくことはできないのでしょうか?コンストラクタが画面遷移毎にコールされていたので毎回初期化されているのかもしれませんが。。。 もしそうだとしたらプロパティはどういう使い方をするためにあるのでしょうか? プロパティの使い方や画面をまたいだ値の保持の仕方についてご教授いただければ幸いです。 よろしくお願いします。
回答: `$this` と言われているのが ZendFramework2 のコントローラクラスなら、仰るように、リクエストを受け付けるたびに新しいインスタンスが生成されます。そのプロパティはあくまで「1リクエストを処理する間、データを保持しておくもの」とお考えください。 > > PHPではないのですが、C++やObjectiveCを利用したことがありまして、そちらではメンバ変数の値がインスタンスがある間はずっと残っていました。 > > > 「インスタンスがある間は」というのが重要です。デスクトップアプリケーションの場合は最長で「アプリを起動してから終了するまで」残り続けるわけですが、Webアプリケーションの場合、そもそも「起動してから終了するまで」という考え方が少し異なります。 言語や構成にもよりますが、Webアプリケーションでは次のような流れが多いです。 1. Webサーバーがリクエストを受け取る 2. **プログラムを起動し**、リクエストを渡す 3. プログラムは処理を行った結果をWebサーバーに渡して**終了する** 4. Webサーバーが3の結果をレスポンスとして送り返す この場合、リクエストごとにプログラムが終了してしまうため、プログラム内の変数やインスタンスが各リクエストを越えて生存することは不可能です。 ではリクエストを越えてデータを保持したい場合はどうするのかというがセッション管理です。基本的なのが Cookie です。レスポンスで設定したCookieはブラウザで保持され、その後のリクエストで一緒に送信してもらえます。 ただこれは格納可能な量が少ないですし、なんとなればユーザーが自由に閲覧・編集できてしまうので安全な場所ではありません。そういう時には Cookie 上にはセッションIDと呼ばれる識別子だけを残し、その実態はサーバー側のファイルやDBに格納する、という方法を取ります。 「セッション管理」のすべて - ステップ1 [基本のしくみ]:ITpro PHP自身にもセッションを扱う仕組みは用意されていますが、ZF2を通して使うとよいでしょう。この場合 `Zend\Session\Container` というクラスを使うようです。 ZendFramework2の入門から極意まで徹底解説 | ZendFramework2ガイド