PHPのネイティブ$_SESSION
セッションが透過的にシリアライズしUNS PHPのserialization protocolまたはSerializable
interfaceをサポートするオブジェクトをerializeします。明示的にシリアライズする必要はありません。
PHPはresources
をシリアル化できません。これは、PHPのコントロール外のステートフルなリソースに対するハンドルなのでです。このため、PDO
またはPDOStatement
オブジェクトはシリアル化できません。
デフォルトでは、オブジェクトはすべてのプロパティ名と値を保存することによってシリアル化され、同じクラス(コンストラクタを呼び出さずに)を作成してシリアル化されたプロパティを直接設定することによって、 __sleep
と__wakeup
のマジックメソッドを使用するか、Serializable
インターフェイスを実装することで、オブジェクトのシリアル化動作をカスタマイズできます。しかし、両方ではありません! implements Serializable
を使用すると、__sleep
と__wakeup
は無視されます。
一つの重要な注意事項:オブジェクトのシリアル化を使用しているとき、あなたはがあなたがアンシリアライズ(またはそれを読み込むことができオートローダーを持っている)の前にロードされたクラス定義を持っている必要があり、それがは、そのオブジェクトのクラス定義と一致する必要がありますシリアル化されました。クラス定義は直列化されたデータには格納されません。今、あなたの新しいコード直列化オブジェクトにロードするとし
class Test {
public $version = 2;
private $def;
public function setDef ($def) {
$this->def = $def;
}
}
を:今、あなたはこの代わりのようになりTest
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
がバージョン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()"
}
ショーはどのようにあなたは、それをシリアル化しようとしている例外から、あなたが声明をシリアライズしようとしているようです、それは結果ではありません。 –
@ dev-null-dwellerによると'PDOStatement :: fetchObject'の結果をちょうど良いものにすることができます。 –
オブジェクトがデータベースのものである場合、セッションでそれをシリアル化する理由は何ですか?ただDBからもう一度それをつかみなさい。セッションは可能な限り避けなければなりません。 –