IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] utilisation de __destruct()


Sujet :

Langage PHP

  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 243
    Points
    20 243
    Par défaut [POO] utilisation de __destruct()
    Bonjour à tous,

    Après la lecture de quelques cours et poste du forum , j'ai encore quelques problème au niveau du destructeur.

    J'ai lu de nombreuses fois qu'il était implicitement appelé. Ce qui veut dire que si je réinstancie ma classe __destruct est appelé. Mais celà est valable que dans le cas ou réinstancie la classe non ?
    Si la classe n'est instancier qu'une fois, faut il avoir la méthode __destruct() dans sa classe afin que la dernière utilisation de l'objet y fasse référence automatiquement ?

    Et justement dans cette methode destruct je met quoi ? Un simple
    __destruct(){} suffit il à détruire les objet présents ou alors y'a t'il quelque chose à spécifier (genre un unset des variable temporaire par exemple ?)

    Merci de vos réponses

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Bonjour,

    Par défaut, le moteur d'exécution de php se charger de libérer la mémoire que tu as pu utiliser pendant l'exécution de ton script. Par exemple si tu crées des tableaux etc, quand ton script est terminé, il va se charger de libérer toute cette mémoire implicitement.

    Pour une classe c'est le même fonctionnement, si elle contient des tableaux par exemple il se chargera automatiquement de libérer tout ca.

    Par contre tu pourrais très bien vouloir faire un truc particulier dans le destructeur de ta classe, par exemple ecrire dans un fichier "ma classe a été désinstanciée". Pour ca tu as deux méthodes:

    1/ Tu te fais une méthode spéciale (genre free()) qui va se charger d'écrire dans ce fichier et donc tu appelles explicitement la méthode (en faisant $moninstance->free()) quand tu sais que tu n'auras plus besoin de la variable (mais ca ne la libère pas pour autant).

    2/ Tu surcharges la méthode __destruct() qui va se charger de réaliser cette écriture dans le fichier. Cette méthode ne peut pas être appelée explicitement dans ton code. Elle est automatiquement exécutée quand la variable est "déchargée" de la mémoire, donc soit quand tu feras unset($moninstance), ca appellera automatiquement la méthode, soit quand ton script a fini d'être exécuté, le moteur appelera automatiquement cette méthode lui aussi.

    Perso je l'utilise dans un de mes softs qui réserve des ressources sur ma machine dans la base de données, des fois le script va avoir des problemes ou etre trop long, et du coup dans le destructeur je m'assure que la ressource est bien rendue "libre", comme ca meme si le script est trop long a exécuter je suis sur que le destructeur sera appelé automatiquement.

  3. #3
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    Bonjour,
    le fait que __destruct() soit appelée implicitement signifie que tu n'as pas besoin de l'appeler toi-même dans ton code, c'est php qui s'en chargera lui-même.
    Normalement, elle est appelée lorsque l'objet n'est plus référencé par aucun - autre objet ou variable ... c.à.d. quand il ne sert plus à rien.

    - 1er cas de figure :
    Typiquement, l'objet est détruit à la fin de l'exécution du script si il n'est pas sauvegardé en session.

    - 2e cas de figure :
    Si fais quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $a = new Objet();
    $a->methode();
    .....
    $a = new Objet();
    lorsque tu fais le 2e new Objet(), en fait tu créé un deuxieme objet distinct, on a une seule référence ($a) qui pointe successivement vers deux instances différentes. La création du deuxieme objet n'entraine pas directement la destruction du premier, c'est juste que l'on ré-aiguille $a vers ce 2e Objet.
    Par contre, si le premier n'est plus référencé nulle part, alors il devient inutile, et le "garbage collector" (ramasse-miettes) en bon céfran va lui faire sa fête pour libérer de la mémoire.

    - 3e cas de figure :
    si tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $a = new Objet();
    $b->objetReference = $a;
    $a = new Objet();
    à la troisieme ligne, $a ne pointe plus vers la premiere instance de Objet, il pointe désormais vers une autre instance. Par contre l'objet $b, lui, a conservé une référence vers la premiere instance dans l'un de ses atributs. A la fin de ces 3 lignes, la premiere instance est toujours référencée, donc toujours utile, donc elle ne sera pas détruite tout de suite par le garbage collector.

    Citation Envoyé par grunk
    Et justement dans cette methode destruct je met quoi ?
    dans 90% des cas, tu ne mets rien, ce n'est même pas la peine de déclarer cette méthode dans le corps de ta classe !
    Si tu ne définis pas de méthode __destruct(), cela ne va pas empêcher ton objet d'être détruit. Rassures-toi : cela ne va pas faire exploser ton serveur !
    C'est juste que l'objet sera détruit selon la manière "par défaut" de php.
    Là ou définir sa propre methode __destruct() peut être interessant, c'est si tu veux personnaliser la destruction de ton objet.
    Exemple : tu souhaite que lorsque l'objet est détruit, il soit supprimé de la table temporaire ou il est stocké :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Objet
    {
        private $_id;
     
        public function __construct($unId) {
            $this->_id = $unId;
        }
     
        public function __destruct() {
            mysql_connect(...);
            mysql_query('DELETE FROM table_temp WHERE identifiant = '.$this->_id);
    }

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 243
    Points
    20 243
    Par défaut
    Super, merci pour vos réponses
    C'est nettement plus clair désormais !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] utiliser Word avec php
    Par ygaudin dans le forum Langage
    Réponses: 1
    Dernier message: 12/09/2006, 11h04
  2. Réponses: 4
    Dernier message: 25/07/2006, 16h30
  3. Réponses: 21
    Dernier message: 04/05/2006, 20h00
  4. [POO] utilisation d'objets
    Par jexl dans le forum Langage
    Réponses: 2
    Dernier message: 07/03/2006, 10h32
  5. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo