PHP5 indique que les objets sont détruits (la fonction __destruct() est appelée) lorsqu'il n'existe plus de références à un objet. Sauf que ça ne fonctionne plus vraiment dans PHP 5.2. En fait, on se retrouve avec des questions fondamentales qui date de l'orienté-objet et même avant avec les allocations/désallocations de mémoire. Quand détruire un objet?
On peut les détruire lorsqu'il n'existe plus de références à l'objet, mais il faut préciser ce qu'est une référence, les compter, décrémenter leur nombre, c'est énormément de travail pour le langage. On peut les détruire en ordre de construction, on peut les détruire en ordre inverse de construction. On peut les détruire aléatoirement. Dans la documentation de PHP, on dit lorsqu'il n'existe pas de références. Cependant, une référence d'un objet avec "global" dans un destructeur, on en fait quoi? Dans PHP5.2, on en tient pas compte. Donc, l'objet va être supprimer à un moment presque indéterminé. En fait pas indéterminé, déterminé par la version de votre PHP. En PHP 5.0, 5.1, c'est en ordre de construction, en PHP 5.2 c'est en ordre inverse de construction.
Tout ça pour dire que plusieurs scripts qui utilisent __destruct risque de ne plus fonctionner. Par exemple, Wordpress.
- Le bug règlé de PHP 5: destruction dans l'ordre inverse
- Le problème qui est arrivé après la correction (bien attendu tout ceux qui s'attendait au résultat d'avant).
- Le problème dans Wordpress
- Les cris d'alarme des usagers et là. La solution de l'administrateur du système? Passer en PHP 4
Ah les non-dits, un autre problème de communications, documentation...
D'un autre côté, si on y pense, la destruction des objets est compliqué en programmation. Imaginez dans la vraie vie. Moi je dis qu'on devrait faire des scripts qui ne se terminent pas et qui recyclent leur objets. À quand la programmation verte?