Le destructor est appelé:
- pour tout objet que vous avez instancié
- dans la partie de script que vous avez posté, vous n'avez pas instan associé à n'importe quel objet - peut-être que c'est la cause de l'absence de destructeur appelé?
- à la fin du script PHP
l'aide d'un en-tête pour rediriger ne l'empêche pas d'être appelé destructor. Notez également que le destructeur est appelé à la fin du script PHP - mais n'empêche pas la redirection, car l'en-tête indiquant "redirect" a déjà été généré.
Par exemple, avec ce code:
class Test {
public function __destruct() {
echo 'hehe';
file_put_contents('/tmp/test-desctructor.txt', "glop\n");
exit;
}
}
$a = new Test();
header('Location: http://example.com/');
exit;
(Notez que je corrige quelques erreurs, et a ajouté une instanciation réelle de la classe)
Vous ne verrez "hehe
" sur la sortie, mais vous verrez que le fichier a été créé /tmp/test-desctructor.txt
:
$ cat /tmp/test-desctructor.txt
glop
vous aurez besoin de supprimer la redirection si vous voulez obtenir le "hehe
" sur la sortie. Le destructeur est appelé après que l'en-tête a été généré - et appeler l'exit du destructeur ne changera pas le fait que cet en-tête a déjà été généré.
Oh, et voici une note du manual(citant - en bas de la page):
Note: Destructeurs appelé lors de l'arrêt du script des en-têtes HTTP déjà envoyés.
C'est pourquoi vous ne voyez pas votre chaîne "hehe
": le destructeur est appelé; vous ne voyez pas seulement sur l'écran ;-)
Voilà pourquoi j'ai utilisé un fichier dans mon exemple, btw ;-)
Merci pour attraper l'instanciation d'objets. Je l'ai fait dans mon script. Votre explication est très claire, et je vous remercie! –
De rien :-) Amusez-vous! –