簡體   English   中英

如何在PHP中的會話中存儲對象?

[英]How can I store objects in a session in PHP?

您好我想在會話中存儲或保存一個對象,使用類如SessionHandler或數組$ _SESSION,我已經看到,如果我序列化該對象,我可能不會丟失該對象的方法實例..我已經看到seralizing它是可能的,但我想要存儲的對象是由PDOStatement :: fetchObject()創建的,雖然實例類是“Users”我得到這個錯誤:

PDOException:您無法序列化或反序列化PDO實例為什么? 它不是PDO實例..

對不起,我是西班牙人,我不會說英語。謝謝

PHP的原生$_SESSION會話透明地序列化和反序列化支持PHP 序列化協議Serializable接口的對象 您不需要顯式序列化它們。

PHP無法序列化resources因為它們是PHP控件之外的某些有狀態資源的句柄。 這就是您無法序列化PDOPDOStatement對象的原因。

默認情況下,通過保存所有屬性名稱和值來序列化對象,並通過創建具有相同類的對象(不調用構造函數)並直接設置序列化屬性來反序列化。 您可以使用__sleep__wakeup魔術方法或通過實現Serializable接口來自定義對象的序列化行為。 但不是兩個! 如果使用implements Serializable ,則忽略__sleep__wakeup

一個重要的注意事項:使用對象序列化時, 必須在反序列化之前加載類定義(或者具有可以加載它的自動加載器),並且它必須與序列化的對象的類定義匹配。 類定義不存儲在序列化數據中。

例如,假設您有以下內容:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM