我正在嘗試讓以下類別與本機 PHP 序列化相容,特別是在 PHP 8.1 上執行時。
class SerializableDomDocument extends DOMDocument { private $xmlData; public function __sleep(): array { $this->xmlData = $this->saveXML(); return ['xmlData']; } public function __wakeup(): void { $this->loadXML($this->xmlData); } }
在較低的PHP 版本上一切都很好,但8.1 會產生未捕獲的異常:'SerializedDomDocument' 的序列化不允許
每當嘗試將此類物件傳遞給 serialize()
函數時。以下是會產生此類異常的程式碼範例:https://3v4l.org/m8sgc。
我知道 PHP 7.4 中引入的 __serialize()
/ __unserialize()
方法,但使用它們似乎也沒幫助。以下程式碼段會導致與此處觀察到的相同異常:https://3v4l.org/ZU0P3。
class SerializableDomDocument extends DOMDocument { public function __serialize(): array { return ['xmlData' => $this->saveXML()]; } public function __unserialize(array $data): void { $this->loadXML($data['xmlData']); } }
我對這個問題感到非常困惑,並且非常感謝任何提示。目前看來,唯一的前進方向是引入明確規範化器/反規範化器,這將導致程式碼庫 API 發生重大變化。我想避免這種情況。
2021 年 8 月 10 日,此變更已提交至版本 8.1 RC1:
將 DOM 類別標記為不可序列化
因此您無法再序列化這些類別。