J'essaie de rendre la classe suivante compatible avec la sérialisation PHP native, en particulier lors de l'exécution sur 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); } }
Tout va bien sur les versions inférieures de PHP, mais la 8.1 produit des fonctions 未捕获的异常:'SerializedDomDocument' 的序列化不允许
每当尝试将此类对象传递给 serialize()
. Voici un exemple de code qui générerait une telle exception : https://3v4l.org/m8sgc.
Je connais les méthodes __serialize()
/ __unserialize()
introduites dans PHP 7.4, mais leur utilisation ne semble pas non plus aider. L'extrait de code suivant provoque la même exception observée ici : 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']); } }
Je suis très confus à propos de ce problème et j'apprécierais vraiment tous les conseils. Pour le moment, il semble que la seule voie à suivre consiste à introduire des normaliseurs/dénormaliseurs explicites, ce qui entraînera des changements importants dans l'API de base de code. Je veux éviter cette situation.
Le 10 août 2021, ce changement a été validé sur la version 8.1 RC1 :
Marquer les classes DOM comme non sérialisables
Vous ne pouvez donc plus sérialiser ces classes.