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()"
}