1

$_SESSIONオブジェクトに定期的に組み込まれるいくつかの一般的なクラスオブジェクトを作成しています。オブジェクトをセッションに追加しているときに、シリアル化せずに追加できる場合もありますが、信頼性が低いため、最初にシリアル化すると、毎回機能することを学びました。

私は以下が信じられないほど退屈で反復的で不格好であると思います...それは私がセッションからオブジェクトをチェックアウトしなければならないようなものですいくつかの作業をしてからそれを正しい方法でチェックすることを忘れないでください。効率的で再利用可能な、より良い/より創造的な方法はありますか?PHPの専門家を助ける

// Painful Code
$tmpObj = new clsSession;  // Class setup for intellisense to work.
$tmpObj = unserialize($_SESSION['objSession']);  // I assign so i can get intellisense as well.  
$tmpObj //... do some work make some changes some other logic could be lengthy... 
// and then i have to remember to do the following
$_SESSION['objSession'] = serialize($tmpObj);
unset $tmpObj;

/* or better */

$tmpObj = $_SESSION['objSession'];
$tmpObj = unserialize($tmpObj);
$tmpObj //... do some work make some changes some other logic
//and then i have to remember to do the following
$_SESSION['objSession'] = serialize($tmpObj);
unset $tmpObj;
4

4 に答える 4

0

シリアル化されているオブジェクトでは、__sleepマジック メソッドを使用します。これは、リクエスト間で必要なプロパティの配列を返すだけで、SESSION の自動シリアル化オブジェクトが正しく機能することを可能にします。

例えば

public function __sleep() {
    return array('these', 'are', 'property', 'identifiers');
}
于 2013-01-17T16:50:57.143 に答える
0

私が何かを見逃していない限り、あなたがしているのは2回シリアル化することだけです:

<?php

class Foo{
    public $id;
}

$f = new Foo;
$f->id = 33;

var_dump( serialize($f) ); // Standard storage
var_dump( serialize(serialize($f)) ); // Yours

私が見つけることができる唯一の違いは、標準の自動アンシリアライズがセッションのロード ( on session_start()) で発生することです。これは多くの場合、初期段階で発生し、まだクラス定義をロードしていない可能性があります。unserialize()あなたのコードでは、セッションが最初に読み込まれ、手動で呼び出すとオブジェクトが再構成されます。

ディレクティブを見直して、include_once()session_start() が発生する前に、必要なすべてのクラス定義がロードされていることを確認することをお勧めします。

これは非常に強制的なテスト ケースです。

<?php

session_start();
if( empty($_SESSION) ){
    require_once('./foo.php');

    $f = new Foo;
    $f->id = 33;

    $_SESSION['f'] = $f;
    // object(Foo)#1 (1) { ["id"]=> int(33) } 
}else{
    $f = $_SESSION['f'];
    // object(__PHP_Incomplete_Class)#1 (2) { ["__PHP_Incomplete_Class_Name"]=> string(3) "Foo" ["id"]=> int(33) } 
}
var_dump($f);
于 2013-01-17T16:59:21.663 に答える
0

ティム、ご意見ありがとうございます。何年も前に、オブジェクトとセッションで安定性の問題を経験しました。シリアライズとノンシリアライズ。セッションのデシリアライゼーション中のクラス定義の欠落はよくあることです。クラス定義が定義されていない場合、PHP はクラス __PHP_Incomplete_Class の不完全なオブジェクトを作成します。この退化したオブジェクトには、すべてのメソッドがありません。このエラーを回避するには、セッションを開始する前にすべてのクラス定義を含める必要があります。したがって、セッションを開始する前にオートローダーを実装すると、問題は発生しません。このソリューションは、過去 6 年以上にわたってうまく機能しています。

于 2013-01-18T14:05:38.013 に答える
0

最初にシリアル化せずに、オブジェクトをセッションに直接格納できます。これは、セッションの保存時にシリアル化が自動的に行われるためです。クラス定義をオートロードしていることを確認してください。そうでない場合は、保存されたセッション オブジェクトを使用するすべてのページにクラス定義を含める必要があります。

于 2013-01-17T16:52:32.877 に答える