3 votes

Destructeur PHP et relation avec le destructeur c++ ?

J'ai du mal à comprendre ce qui DEVRAIT être fait dans le destructeur d'une classe PHP.

Je viens de C++. En c++, si j'ai ceci :

class A{
    int n;
    ~A(){
    }
}

class A2{
    int* n;
    ~A2(){
        delete n;
    }
}

Le langage SAIT que si une instance de A est hors champ, son membre n doit être désalloué, car n n'appartient qu'à ce cas précis. MAIS si une instance de A2 sort de sa portée, il ne sait pas si la mémoire pointée par n doit être désallouée (il y a peut-être d'autres pointeurs qui pointent vers cette même mémoire). MAIS, si nous sommes sûrs de vouloir désallouer cette mémoire SI A2 L'instance sort du champ d'application, nous devons la "supprimer" MANUELLEMENT, car c'est notre intention.

Qu'en est-il de php ? Je suis un nouveau venu et j'ai vu plusieurs solutions :

class A3{
    private $n;
    public function __destruct(){
    //Choice 1
    unset($this->$n);

    //Choice 2
    delete $this->$n;

    //Choice 3

    }
}

Je ne suis pas sûr de la différence entre unset et delete, mais peu importe. On m'a dit (cf choix 3) que PHP désalloue "tout seul" la mémoire si on ne fait rien. Mais je ne comprends pas alors l'utilisation de delete ou unset dans le destructeur. Nous n'avons pas la notion de "pointeur" en PHP, donc si une instance de A3 sort de son champ d'application, il est naturel de désallouer n .

Alors, y a-t-il quelque chose qui DEVRAIT être fait dans un destructeur ? Si non, il n'y a jamais d'utilisation de delete ou unset dans le destructeur ?

EDIT : code réécrit basé sur le commentaire d'axiac

3voto

axiac Points 13906

Que faut-il écrire dans le destructeur en C++ ?
Vous écrivez probablement des déclarations qui libèrent les ressources acquises pendant la durée de vie de l'objet, n'est-ce pas ?

C'est la même chose en PHP, mais la plupart du temps, vous n'avez pas besoin de mettre quoi que ce soit dans le destructeur car la mémoire et les ressources inutilisées sont automatiquement récupérées par l'interpréteur.

Il est cependant recommandé de libérer dans le destructeur les ressources acquises dans le constructeur (ou pendant la durée de vie de l'objet), soit pour être sûr que la mémoire qu'elles utilisent est libérée plus tôt, soit à titre de documentation : quelqu'un qui lit un destructeur et trouve un appel à fclose() sait que dans le constructeur ou peut-être dans une autre méthode de la classe, un appel jumelé à fopen() a été exécuté et le gestionnaire a été stocké à l'intérieur de l'objet.


P.S.

  1. La ligne $n de :

    class A3{
        $n
        public function __deconstruct(){

    est incorrecte. Il doit se terminer par un point-virgule ( ; ) et si l'intention est de déclarer une propriété, la syntaxe correcte est de commencer par l'un des spécificateurs de visibilité ( private , protected o public ), comme ceci :

    class A3 {
        private $n;
        public function __destruct() {
  2. Le nom de la méthode du destructeur est __destruct() et non __destructor() .

  3. Il n'y a pas delete en PHP : http://php.net/manual/en/function.delete.php . Vous n'avez qu'un seul choix : le choix n°1 ( unset($this->pdo); ).

Plus d'informations sur classes et objets en PHP. Commencez par oublier la plupart de ce que vous connaissez du C++ car la POO de PHP fonctionne d'une manière différente et votre connaissance du C++ fera probablement plus de mal que de bien à l'apprentissage de la POO en PHP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X