php:オブジェクトをセッションに保存する

ここで最近開かれたリソースで、スクリプトで作成されたオブジェクトをphpセッションに保存することに関する質問に出会いました。



セッションにオブジェクトを保存するという原則がどれほど悪いかは、原則として説明しませんが、そのようなオブジェクトを操作する方法を示します。 しかし、専門家が既にphp.netでレシピを見つけており、すべてが些細なものであると考えている場合、私は彼らに完全に同意します。 ただし、少し知識があれば...



そのため、たとえば特定のユーザーにオブジェクトを配置することにしました。



およそのファイルは次のようになります。



myclass.php:

 <?php class MyClass { public $user; }
      
      







index.php:

 <?php session_start(); require 'myclass.php'; header("content-type: text/plain"); if (!isset($_SESSION['classTst'])) { $myclass = new MyClass(); $myclass->user = 'me'; $_SESSION['classTst'] = $myclass; echo "Class is into session array now"; } else { echo "\$_SESSION['classTst'] dump: \n\n"; var_dump($_SESSION['classTst']); } 
      





<?php session_start(); require 'myclass.php'; header("content-type: text/plain"); if (!isset($_SESSION['classTst'])) { $myclass = new MyClass(); $myclass->user = 'me'; $_SESSION['classTst'] = $myclass; echo "Class is into session array now"; } else { echo "\$_SESSION['classTst'] dump: \n\n"; var_dump($_SESSION['classTst']); }









それでは、私たちが何をしているかを理解しましょう。



index.phpスクリプトを初めて実行すると、クラスmyclassのオブジェクトが作成され、セッションに配置されます。 それ以降の場合(セッションを破棄するか、ブラウザへのCookieの形でセッションへの「リンク」を破棄するまで)、オブジェクトが既に存在するセッションを読み込みます。 ただし、var_dump()は、MyClassクラスのインスタンスである代わりに、__ PHP_Incomplete_Classクラスに満足しています。



 $ _SESSION ['classTst']ダンプ: 

オブジェクト(__ PHP_Incomplete_Class)#1(2){
   ["__PHP_Incomplete_Class_Name"] =>
  文字列(7) "MyClass"
   ["ユーザー"] =>
  文字列(2) "me"
 }




すべてが非常に簡単です。 セッションを初期化するとき、phpは$ __ SESSION ['classTst']にMyClassクラスのインスタンスを持っているという事実につまずきます(希望する人は、ファイルのセッション(ファイルにセッションがある場合)を参照できます)。どのクラスのインスタンスであるかの説明付き)。 しかし(驚いた!)、スクリプトからわかるように、セッション開始時のphpはMyClassクラスの存在について何も知りません。 したがって、完全に論理的なインタープリターは、このオブジェクトを特定の__PHP_Incomplete_Classのオブジェクトとして正確に認識します。



ただし、セッションの開始とクラスのロードの順序を変更する必要があります。

 <?php require 'myclass.php'; session_start(); header("content-type: text/plain"); if (!isset($_SESSION['classTst'])) { $myclass = new MyClass(); $myclass->user = 'me'; $_SESSION['classTst'] = $myclass; echo "Class is into session array now"; } else { echo "\$_SESSION['classTst'] dump: \n\n"; var_dump($_SESSION['classTst']); } 
      





<?php require 'myclass.php'; session_start(); header("content-type: text/plain"); if (!isset($_SESSION['classTst'])) { $myclass = new MyClass(); $myclass->user = 'me'; $_SESSION['classTst'] = $myclass; echo "Class is into session array now"; } else { echo "\$_SESSION['classTst'] dump: \n\n"; var_dump($_SESSION['classTst']); }









ほら、私たちは望んだものを手に入れる:



 $ _SESSION ['classTst']ダンプ: 

オブジェクト(MyClass)#1(1){
   ["ユーザー"] =>
  文字列(2) "me"
 }




一般に、すべては本当に簡単です。セッションに格納するすべてのオブジェクトは、セッションを開始するにインタープリターに認識されている必要があります。



したがって、たとえば、標準がsession.auto_start Onである場合、オブジェクトをセッションに保存することは運命ではありません。 また、どのオブジェクトをいつどこで読み込むかを作成者が決定したフレームワークに依存している場合(そして完全に作成者に依存している場合)、特定のオブジェクトをセッションに保存することは、致命的な数になります(他のネストされたオブジェクトを持つオブジェクトの場合)セッションが長時間開始されたときに、たとえばコントローラーの実行前の「オンデマンド」と呼ばれます)。 複合オブジェクト(たとえば、プロパティに2〜3個のサービスオブジェクトを含む)の場合、合理的な疑問が生じる場合があります。「安い」とは何ですか-すべてをセッションにスローするか、データベース(またはデータベースキャッシュ)から1つまたは2つのクエリでオブジェクトを取得しますか?



セッションでオブジェクトを保存するかどうか、そしてプロジェクトの現実に基づいてそれを行う方法-あなたはとにかく決める:)



All Articles