8

こんにちは私はSessionHandlerや配列$_SESSIONのようなクラスを使用して、セッション内にオブジェクトを保存または保存したいと思います。オブジェクトをシリアル化すれば可能であり、そのオブジェクトのメソッドを失いたくないのです。インスタンス..それが可能であることをシリアル化するのを見てきましたが、格納したいオブジェクトはPDOStatement :: fetchObject()によって作成されますが、インスタンスクラスは「Users」ですが、次のエラーが発生します。

PDOException:PDOインスタンスをシリアル化または非シリアル化できないのはなぜですか?PDOインスタンスではありません。

申し訳ありませんが、私はスペイン語で、英語はあまり話せません。ありがとう

4

1 に答える 1

15

PHP のネイティブセッションは、PHP のシリアライゼーション プロトコルまたはインターフェイス$_SESSIONをサポートするオブジェクトを透過的にシリアライズおよびアンシリアライズします。それらを明示的にシリアライズする必要はありません。Serializable

resourcesこれらは PHP の制御外にあるステートフル リソースへのハンドルであるため、PHP はシリアライズできません。PDOこれが、PDOStatementオブジェクトをシリアライズできない理由です。

デフォルトでは、オブジェクトはすべてのプロパティ名と値を保存することによってシリアル化され、(コンストラクターを呼び出さずに) 同じクラスでオブジェクトを作成し、シリアル化されたプロパティを直接設定することによって非シリアル化されます。__sleepおよび__wakeupマジック メソッドを使用するか、インターフェイスを実装することにより、オブジェクトのシリアル化動作をカスタマイズできSerializableます。しかし、両方ではありません!を使用した場合implements Serializable__sleepおよび__wakeupは無視されます。

1 つの重要な注意:オブジェクトのシリアル化を使用する場合、シリアル化を解除する前にクラス定義をロードする必要があり (またはロードできるオートローダーが必要)、シリアル化されたオブジェクトのクラス定義と一致する必要があります。クラス定義は、シリアル化されたデータには格納されません。

たとえば、次のものがあるとします。

class Test {
    public $version = 1;
    protected $abc;
    public function setAbc($abc) {
        $this->abc = $abc;
    }
}

$t = new Test();
$t->setAbc(123);
$_SESSION['mytest'] = $t;

Testある日を次のように変更するとします。

class Test {
    public $version = 2;
    private $def;
    public function setDef ($def) {
        $this->def = $def;
    }
}

Testバージョン 1のときにシリアル化されたオブジェクトを新しいコードにロードするとします。

$t = $_SESSION['mytest']; // this was stored yesterday, when Test was version 1

var_dump($t)

あなたはこれを得るでしょう:

object(Test)#1 (3) {
  ["version"]=>
  int(1)
  ["def":"Test":private]=>
  NULL
  ["abc":protected]=>
  int(123)
}

さらに、古い方法は使用できません。

if ($t->version == 1) { // Check for class version
    $t->setAbc(345); // "Fatal error: Call to undefined method Test::setAbc()"
}
于 2012-10-30T23:30:05.400 に答える