Interface Serializable avec PHP

Retour aux articles Dans #php le 24/03/2016 par Emmanuel BALLERY

Interface Serializable avec PHP

Il vous est peut-être apparu nécessaire un jour de sérialiser un objet PHP pour pouvoir le persister ou le transporter. Mais votre objet est plus complexe qu'il n'y parait. Il est donc nécessaire de changer la méthode de sérialisation par défaut de PHP.

Prenons par exemple cette classs User:

Créons une instance $user:

Cet objet fait référence à un fichier, ce qui peut poser des problèmes: va-t-il linéariser le binaire, va-t-on avoir des problèmes de mémoire ...

En informatique, la sérialisation est un processus visant à coder l'état d'une information qui est en mémoire sous la forme d'une suite d'informations plus petites le plus souvent des octets voire des bits. Cette suite pourra par exemple être utilisée pour la sauvegarde (persistance) ou le transport sur le réseau (proxy, RPC…). L'activité symétrique, visant à décoder cette suite pour créer une copie conforme de l'information d'origine, s'appelle la désérialisation.

Les méthodes magiques: __sleep et __wakeup

Par défaut, si vous tentez de sérialiser un objet PHP, la fonction serialize vérifie si votre classe a une méthode avec le nom __sleep. Si cette méthode est trouvée, elle sera exécutée avant toute linéarisation. Elle est supposée retourner un tableau avec les noms de toutes les variables de l'objet qui doivent être linéarisées (elle peut aussi nettoyer l'objet de ce qu'il ne doit pas garder).

À l'inverse, la fonction unserialize vérifie la présence d'une méthode dont le nom est __wakeup. Si elle est présente, cette fonction peut reconstruire toute ressource que l'objet pourrait possèder.

Les limites de cette méthode

  • Il n'est pas possible pour __sleep de retourner des noms de propriétés privées des classes parentes. Le faire résultera en une erreur de niveau E_NOTICE.
  • La fonction n'est pas assez souple pour stocker les propriétés sous un autre format (par exemple, ne garder que le chemin d'un fichier au lieu de garder un objet SplFileInfo)

Dans notre cas:

Références:

L'interface Serializable de PHP

Si votre classe hérite de l'interface Serializable, la sérialisation de vos objets va changer. Les deux nouvelles méthodes introduites par l'interface seront interrogées: serialize et unserialize.

La méthode serialize est chargée de renvoyer une représentation de votre objet sous la forme d'une chaîne de caractère. Pour cela vous pouvez vous servir des nombreuses méthodes qui permettent d'accomplir cette transformation: serialize, json_encode, implode, ...

La méthode unserialize est chargée de faire la transformation inverse, pour restituer les valeurs dans les propriétés de l'objet. Les fonctions inverses sont disponibles: unserialize, json_decode, explode, ...

Dans notre cas:

Pour sérialiser les données, nous utilisons json_encode, qui permet de conserver le typage. En ce qui concerne le fichier de typeSplFileInfo, nous ne conservons que son chemin sur le disque.

Pour dé-sérialiser les données nous décodons le json avec json_decode, puis nous recréons l'objet SplFileInfo à partir du chemin du fichier.

Retour aux articles