Introduction
PHP Manual
PHP Manual»Interfaces et Classes Prédéfinies»Serializable

L'interface Serializable

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Interface permettant de personnaliser la sérialisation.

Les classes implémentant cette interface ne supportent plus __sleep() et __wakeup(). La méthode serialize() est appelée chaque fois qu'une instance doit être sérialisée. Elle n'appelle pas __destruct() et ne produit aucun autre effet de bord, sauf si cela est codé dans la méthode. Lorsque les données sont désérialisées, la classe est connue et la méthode unserialize() appropriée est appelée comme constructeur au lieu d'appeler __construct(). Le constructeur peut être appelé depuis la méthode unserialize() si besoin.

Avertissement

À partir de PHP 8.1.0, une classe qui implémente Serializable sans aussi implémenter __serialize() et __unserialize() génèrera une notice de dépréciation.

Le nouveau code devrait utiliser les méthodes magiques __serialize() et __unserialize(), disponibles à partir de PHP 7.4.0. Lorsqu'une classe les déclare en plus de cette interface, serialize() utilise toujours __serialize() et n'atteint jamais Serializable::serialize(). La désérialisation est déterminée par le format des données : un flux écrit par PHP 7.4.0 ou ultérieur est lu par __unserialize(), un flux écrit avant l'est toujours par Serializable::unserialize(). Implémenter Serializable reste donc utile pour lire d'anciens flux, et pour satisfaire une déclaration de type Serializable ; déclarer les quatre méthodes couvre tous les cas et évite la notice de dépréciation.

Note:

Les méthodes magiques n'ont pas d'interface propre : une classe qui les déclare sans implémenter Serializable n'en est pas une instance. method_exists() est le moyen de les détecter.

interface Serializable {
/* Méthodes */
public function serialize(): ?string
public function unserialize(string $data): void
}

Exemple #1 Prise en charge de PHP 7.1.0 à 7.3.0

Les méthodes magiques portent la forme sérialisée, et les méthodes de l'interface leur délèguent, de sorte qu'une seule représentation convient dans les deux cas.

<?php
class Task implements Serializable
{
    private $label;

    public function __construct($label)
    {
        $this->label = $label;
    }

    public function __serialize(): array
    {
        return ['label' => $this->label];
    }

    public function __unserialize(array $data): void
    {
        $this->label = $data['label'];
    }

    // Jamais appelé à partir de PHP 7.4.0
    public function serialize()
    {
        return serialize($this->__serialize());
    }

    // Toujours appelé à partir de PHP 7.4.0, pour les données écrites avant
    public function unserialize($data)
    {
        $this->__unserialize(unserialize($data));
    }
}

var_dump(serialize(new Task('deploy')));
?>

L'exemple ci-dessus va afficher :

string(40) "O:4:"Task":1:{s:5:"label";s:6:"deploy";}"

Avant PHP 7.4.0, le même code sérialise via l'interface et affiche string(47) "C:4:"Task":31:{a:1:{s:5:"label";s:6:"deploy";}}".

Sommaire

To Top