PHP – Serialization d’éléments enfants

La sérialization est un procédé courant et très utilisé pour le stockage en session par exemple.
Dans un projet POO il n’est pas rare de trouver une classe dédié à la sérialization d’objets et leur stockage en session pour assurer le trafic de manière transparente dans le reste du projet.

Je me suis cependant trouvé sur un problème lors d’un précédent développement Symfony, en effet j’ai utilisé une technique de MappedSuperClass pour gérer ma pluralité d’attributs entre les différents acteurs de la solution. J’ai eu pour des besoins techniques l’obligation de persister mon objet en session, mais j’ai eu la malheureuse constatation de n’avoir que des données lié à son parent.

Après plusieurs debug et quelques aller retour sur nos sites de debug préférés, je me suis rendu compte que le problème venait de la sérialization d’un objet hérité en passant par l’enfant.

Pour corriger le problème j’ai donc décidé de faire le travail moi-même en implémentant l’interface de serialization de PHP pour indiquer à celui-ci comment correctement serializer mon objet.

// Ici l'interface nous permet d'implémenter les fonctions serialize et unserialize de l'objet

class Toto extends Titi implements Serializable{
    public function serialize(){
        // Je récupère les attributs de mon objet en tant que tableau que je renvoi a la fonction serialize
        return serialize(get_object_vars($this));
    }

    public function unserialize($data) {
        // Je récupère mon tableau
        $datas = unserialize($data);

        // Je ré-attribut les valeurs de mon tableau en ré-hydratant l'objet
        foreach ($datas as $key => $value) {
            $this->$key = $value;
        }
    }
}

Comparer des objets DateInterval en PHP

Malheuresement pour les développeurs PHP, la surchage des opérateurs en POO n’est aujourd’hui par encore à notre portée sans avoir à installer des extensions. Bien que les methodes comme __toString() nous facilite un peu la tâche, comparer des objets n’est pas toujours du gateau.

J’ai eu besoin de comparer des objets de type DateInterval recemment, et faineans que je suis, je me voyais mal reprendre chaques attributs de l’objet pour le convertir en secondes pour donner quelques chose du genre :

$dateInterval->s + $dateInterval->i*60 + $dateInterval->h*3600 + $dateInterval->d*86400 etc ...

J’ai tout simplement trouvé l’astuce sur notre saint des saints StackOverflow, ou un très bon billet nous indique qu’il suffit dans ce cas d’une simple conversion d’objet pour faire l’affaire :

$intervalOne = new DateInterval('PT1H');
$intervalTwo = new DateInterval('P1D');

if((array) $intervalOne < (array)$intervalTwo){
    echo "Tout va bien, mes rapports temporels sont toujours corrects";
}