Saya cuba menjadikan kelas berikut serasi dengan pensirilan PHP asli, khususnya apabila berjalan pada 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); } }
Semuanya baik pada versi PHP yang lebih rendah, tetapi 8.1 menghasilkan 未捕获的异常:'SerializedDomDocument' 的序列化不允许
每当尝试将此类对象传递给 serialize()
fungsi. Berikut ialah contoh kod yang akan menghasilkan pengecualian sedemikian: https://3v4l.org/m8sgc.
Saya sedar tentang __serialize()
/ __unserialize()
kaedah yang diperkenalkan dalam PHP 7.4, tetapi menggunakannya juga nampaknya tidak membantu. Coretan kod berikut menyebabkan pengecualian yang sama diperhatikan di sini: 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']); } }
Saya sangat keliru tentang masalah ini dan sangat menghargai sebarang petua. Pada masa ini nampaknya satu-satunya cara ke hadapan ialah memperkenalkan penormal/denormalisasi eksplisit, yang akan menghasilkan perubahan ketara pada API pangkalan kod. Saya mahu mengelakkan situasi ini.
Pada 10 Ogos 2021, perubahan ini komited kepada versi 8.1 RC1:
Tandai kelas DOM sebagai tidak boleh bersiri
Jadi anda tidak boleh lagi menyusun kelas ini.