From 0fc30f3387bd9665ab991b8154b6e6c356339bb4 Mon Sep 17 00:00:00 2001 From: Louis-Arnaud Date: Tue, 15 Sep 2026 09:28:14 +0200 Subject: [PATCH] [Sync-En] Serializable: point at the magic methods and fix the example --- language/predefined/serializable.xml | 102 +++++++++++++++++++-------- 1 file changed, 72 insertions(+), 30 deletions(-) diff --git a/language/predefined/serializable.xml b/language/predefined/serializable.xml index 5f10a6248..533e20559 100644 --- a/language/predefined/serializable.xml +++ b/language/predefined/serializable.xml @@ -1,5 +1,5 @@ - + @@ -8,7 +8,6 @@ -
&reftitle.intro; @@ -38,13 +37,40 @@ una advertencia de deprecación. + + + El código nuevo debería utilizar en su lugar los métodos mágicos + __serialize() y + __unserialize(), + disponibles a partir de PHP 7.4.0. + Cuando una clase declara a la vez estos métodos y esta interfaz, + serialize siempre utiliza + __serialize() y nunca llega a + Serializable::serialize. + La deserialización, en cambio, depende del formato de los datos: unos datos + escritos por PHP 7.4.0 o posterior son leídos por + __unserialize(), y los escritos + antes siguen siendo leídos por + Serializable::unserialize. + Por lo tanto, implementar Serializable sigue + siendo útil para leer esos datos más antiguos, y para satisfacer una + declaración de tipo Serializable; declarar + los cuatro métodos cubre todos los casos y evita el aviso de deprecación. + + + + + Los métodos mágicos no tienen una interfaz propia, por lo que una clase que + los declara sin implementar Serializable + no es una instancia de esta. + method_exists es la forma de detectarlos. + +
-
&reftitle.interfacesynopsis; - Serializable @@ -53,53 +79,69 @@ &Methods; -
&reftitle.examples; - - Ejemplo simple + + Compatibilidad con PHP 7.1.0 a 7.3.0 + + Los métodos mágicos contienen la forma serializada, y los métodos de la + interfaz delegan en ellos, de modo que una única representación sirve + para ambos. + data = "Mis datos privados"; - } - public function serialize() { - return serialize($this->data); - } - public function unserialize($data) { - $this->data = unserialize($data); +class Task implements Serializable +{ + private $label; + + public function __construct($label) + { + $this->label = $label; } - public function getData() { - return $this->data; + + public function __serialize(): array + { + return ['label' => $this->label]; } -} -$obj = new obj; -$ser = serialize($obj); + public function __unserialize(array $data): void + { + $this->label = $data['label']; + } -var_dump($ser); + // Nunca es llamado a partir de PHP 7.4.0 + public function serialize() + { + return serialize($this->__serialize()); + } -$newobj = unserialize($ser); + // Sigue siendo llamado a partir de PHP 7.4.0, para datos escritos antes + public function unserialize($data) + { + $this->__unserialize(unserialize($data)); + } +} -var_dump($newobj->getData()); +var_dump(serialize(new Task('deploy'))); ?> ]]> - &example.outputs.similar; + &example.outputs; - + + Antes de PHP 7.4.0, el mismo código serializa mediante la interfaz y + muestra + string(47) "C:4:"Task":31:{a:1:{s:5:"label";s:6:"deploy";}}". + +