Sauvegarder l’état d’un objet
En nos temps où l’orienté-objet est roi, un schéma de fonctionnement revient régulièrement :
Un objet dont chaque instance correspond à une ligne en base. On charge les données lors de l’initialisation de l’objet (dans son constructeur), puis on les sauvegardes lorsque l’on a fini de les modifier.
La problématique est la suivante : mais quand a-t-on fini de les modifier? Dans 99% des cas, « ça dépend« . Les méthodes pour implémenter cette notion sont légions: une méthode genre save
que l’on appelle « à la fin« , une sauvegarde systématique à chaque modification, et la rationnelle mais risquée sauvegarde dans le destructeur de l’objet.
Cette dernière méthode semble la plus intéressante, puisqu’elle défini avec une presque certitude la notion de « fin » de modifications. Toutefois, dans notre contexte orienté objet, il y a de fortes chances que l’on utilise un objet pour se connecter à la base de donnée. Et cet objet fermera probablement sa connexion dans le destructeur. Et comment savoir que la base est encore connectée lors de l’exécution du destructeur de notre objet de données? C’est le drame.
Mais tous les drames ont une solution !
Dans notre cas (car j’aborderai la question de l’Irak une autre fois… Ou pas.), la voici :
1 2 3 4 5 6 7 8 9 10 11 12 13 | class DoubleDestructor { function __construct() { echo 'Construct<br/>'; register_shutdown_function(array(&$this, '__shutdown')); } function __shutdown() { echo 'Shutdown<br/>'; } function __destruct() { echo 'Destruct<br/>'; } } $foo = new DoubleDestructor(); |
Sortie :
Construct Shutdown Destruct
Hé ouais, tous les ‘shutdown’ sont forcément appellés avant que le premier ‘destruct’ le soit. Et voilà un endroit parfait pour mettre notre sauvegarde. Allez, salut.
Commentaires récents