2009-09-21 13 views

Répondre

12

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 ;-)

+0

Merci pour attraper l'instanciation d'objets. Je l'ai fait dans mon script. Votre explication est très claire, et je vous remercie! –

+0

De rien :-) Amusez-vous! –