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] Fonctionnement des destructeurs


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 233
    Points : 122
    Points
    122
    Par défaut [POO] Fonctionnement des destructeurs
    Bongour,

    En programmation objet sous php5, je ne comprend pas quand les objets sous détruit puisqu'il n'y a pas de delete. Est-ce lorsque l'on arrive à la fin de la page?
    ou quand on change de page?

    Et j'en viens à mon cas particulier, que j'ai pas encore programmer :
    Soit j'aurais une classe dérivé de la classe "Exception". D'autre part, j'ai une autre classe spécialement pour l'accès à la base de donnée (connexion, retourne résultat sous différents formats, ajout enregistrement...etc). Et à chaque erreur, je lève une exeption du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(erreur) throw new class_derive_exception;
    .

    Puis, lorsque j'utilise une méthode de cette classe, je l'encadre avec "try" et "catch" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try{class_BDD->fct();} catch{ FONCTION(); }
    Et je voudrait savoir ce qui se passe si la fonction "FONCTION()" est une fonction de redirrection du style "Location : page_futur.html".

    Le destructeur de la classe "class_derive_exception" sera t'il exécuté? C'est important dans le cas où ce même destructeur ferme un fichier (fichier de journal d'erreur).

    D'avance Merki....

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 241
    Points : 15 543
    Points
    15 543
    Par défaut
    le destructeur est automatiquement appelé à la sortie du script ou quand on fait "$objet = NULL;" ou "unset($objet);"

    regarde là :
    http://php.net/oop5.decon

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 233
    Points : 122
    Points
    122
    Par défaut suite
    merci pour ta reponse rapide. ce "unset" doit etre l'equivalent du delete en c++ dans ce cas la. Mais si je fais une redirrection, le destructeur sera t'il appele ?

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 241
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par kuja2053 Voir le message
    si je fais une redirrection, le destructeur sera t'il appele ?
    oui tout est appelé automatiquement à la fin du script : destructeurs, fermetures des connexions au bases de données, libération des ressources

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 233
    Points : 122
    Points
    122
    Par défaut
    Merki beaucoup!!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Je me permets de réouvrir ce topic pour me faire préciser quelque chose. Dans la doc PHP, j'ai lu :

    Le destructeur est appelé durant l'arrêt du script, donc les en-têtes sont toujours déjà envoyés.
    Est-ce à dire que si on ne détruit pas l'objet explicitement, PHP se charge de faire le ménage complet à la fin du script ?

    Je croyais que PHP avait un garbage collector. Du coup, je ne détruis rien moi... C'est grave docteur ?

    Vous me confirmez bien que si j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    test.php
    <?php
      class essai {
        public $a = "kkkkk";
      }
     
      $t = new essai;
      echo "bonjour";
    ?>
    Si j'appelle test.php, le navigateur écrira "bonjour", puis côté serveur, la mémoire sera clean, je veux dire sans fuite ?

    Dans un autre topic que je viens de poster, je relate un problème que j'ai en cas de charge sur le serveur, à savoir APACHE qui tombe avec un status 3221225477. Pourrait-ce venir de là ?

    @++, Stéphane.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 199
    Points : 116
    Points
    116
    Par défaut
    Les destructeurs des classes php servent à libérer des ressources utilisées par la classe comme une connection à une BDD par exemple cependant ces ressources seront libérées à la fin de l'exécution de ton script dans tous les cas. Il est cependant parfois utile que ces ressources soient libérées avant le fin de l'exécution du script pour l'accélérer ou décharger un peu la mémoire. Cependant ce n'est pas la même problematique qu'avec un code C++ où les destructeurs doivent libérer la mémoire pointée par des données membres parce que personne ne le fera à leur place et que les conséquences peuvent être désastreuses...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup pour ta réponse.

    Mais au risque de passer pour un gros neuneu, pouvez vous me confirmer que j'ai bien compris :

    Contrairement à C ou à Delphi, en PHP5, en créant des objets et en ne les détruisant pas explicitement, aucun risque de fuite de mémoire. C'est ça ?

    @++, Stéphane.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 306
    Points : 194
    Points
    194
    Par défaut
    Oui, c'est ça.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Super

    Merci d'avoir pris le temps de me répondre.

    @++, Stéphane.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Re,

    Vous allez me prendre pour un tordu...

    J'ai une page que je construits avec le moteur de template phplib, qui contient toute une série d'objets que je crée, et que j'essaie quand même de détruire explicitement.

    Cette page est rafraichie toute les 10 secondes via une META refresh.

    Et bien quand je scrute le process APACHE (sous Windows / gestionnaire des taches / processus), sa taille ne cesse d'augmenter petit à petit. C'est lent, mais progressif, à coup de 4 Ko de temps en temps.

    1) Pourquoi ?... Je pensais que lors d'un rechargement de page, APACHE faisait le ménage moi... Non ?

    C'est ennuyeux car je crois bien que c'est de là que vient mon plantage d'APACHE quand plusieurs clients affichent cette page ensemble, au bout de quelques heures.

    Petite précision : dans php.ini, concernant le paramètre session.gc_probability. Je comprends bien ce qu'il veut dire, mais j'ai deux questions :

    2) pourquoi "session" ? Le GC n'agirait que dans $_SESSION ???
    3) qu'entendent-ils par "requête" quand ils disent que ce % fixe la proba que le GC soit déclenché à chaque requête ? (ils veulent dire à chaque appel d'un script ?).

    @++, Stéphane.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 14/01/2010, 18h14
  2. [POO] Appel des destructeurs
    Par Merfolk dans le forum Langage
    Réponses: 2
    Dernier message: 28/03/2008, 17h59
  3. Fonctionnement des fichiers.
    Par phoenix440 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 29/05/2005, 15h36
  4. Réponses: 13
    Dernier message: 28/08/2004, 18h43
  5. [langage] fonctionnement des Processus
    Par GMI3 dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2003, 11h12

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