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 :

Destruction d'une classe sous PHP5


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 264
    Points : 141
    Points
    141
    Par défaut Destruction d'une classe sous PHP5
    Bonjour,

    Existe-il une fonction permettant de détruire une classe ou un simple

    unset(Maclass);

    suffit ?


    En vous remerciant pour vos éclaircissements.

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Bonjour

    Détruire la classe ou détruire une instance de l'objet ?
    Je ne sais pas faire la premier cas. Pour le second cas, tu peux utiliser la méthode __destruct ( voir http://fr.php.net/manual/fr/language.oop5.decon.php )

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 264
    Points : 141
    Points
    141
    Par défaut
    oui c'est bien l'instensation de la classe. Il parait que c'est détruit automatiquement en fin de page, mais c'est pas confirmé..

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    ben je te le confirmes. Mis à part bien sur si tu utilises un système de mémoire partagée comme peut le proposer apc.

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par ctrl+z Voir le message
    oui c'est bien l'instensation de la classe. Il parait que c'est détruit automatiquement en fin de page, mais c'est pas confirmé..
    Pas en fin de page, plutôt en fin de script.
    Un test très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    class Foo {
        public function __construct() {
            print "YEEPEA, i'm alive !";
        }
        public function __destruct() {
            print "AAARRRRGGGHHHH, i'm dead !";
        }
    }
     
    $myObj = new Foo();
     
    unset($myObj);
    unset() appelle bien le destructeur.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 264
    Points : 141
    Points
    141
    Par défaut
    des ouis des nons...

    le test ci-dessus retourne« YEEPEA, i'm alive !AAARRRRGGGHHHH, i'm dead ! »
    y'a pas une fonction qui permet de vérifier si l'objet est toujours ou non instancié, pas si la variable existe mais bien l'objet ?

    « YEEPEA, i'm alive !AAARRRRGGGHHHH, i'm dead ! »

    $myObj = new Foo();
    testIns = $myObj;
    unset($myObj);

    echo $testIns;

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Citation Envoyé par ctrl+z Voir le message



    $myObj = new Foo();
    testIns = $myObj;
    unset($myObj);

    echo $testIns;
    Heu dans ce cas $testIns aura bien une classe de Foo(), puisque tu en fait une copie.

    Si tu veux détruire la classe utilise la méthode __destruct

    soit la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Foo {
        public function __construct() {
            print "YEEPEA, i'm alive !";
        }
        public function __destruct() {
            print "AAARRRRGGGHHHH, i'm dead !";
        }
    public function ecrit(){
     
    echo ' j\'existe ou pas';
    }
    }
    et puis essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $myObj = new Foo(); 
    $myObj->__destruct();
     
     
    //vérifie en rappelant la méthode ecrit
    $myObj->ecrit();
     
    //tu auras dans ce cas une erreur ;

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Un cas intéressant dans ce commentaire du manuel : http://fr.php.net/manual/fr/function.unset.php#84911

    Intéressant pour ce qu'il y est dit, mais aussi pour la question présente
    Objects will only free their resources and trigger their __destruct method when *all* references are unsetted.
    Donc si le destructeur est appelé, les ressources sont bien libérées.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Cela est bien l'affaire du gc. C'est lui qui détecte que les objets n'ont plus de références et zou les détruits.
    Maintenant la question qui me vient à l'esprit, un objet instancié dans le contexte d'une fonction z, sans aucune autre réf, est il bien détruit à la sortie de la fonction ou bien à la fin du script ?
    Avec le petit exemple qui va bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?
    class x{
    	public function __construct(){
    		echo "hello, it's me !"."<br />";
    	}
    	public function __destruct(){
    		echo "Bye, i'm not there anymore..."."<br />";
    	}
    }
     
    echo "let's go."."<br />";
    function z(){
    	$t = new x();
    }
    echo "let's make call to z."."<br />";
    z();
    echo "let's end script."."<br />";
     
    ?>
    Et le résultat nous montrant que le gc fait son job à chaque changement de contexte :
    let's go.
    let's make call to z.
    hello, it's me !
    Bye, i'm not there anymore...
    let's end script.
    Est il encore nécessaire de se soucier de la destruction des objets en php ?
    Peut être dans certains cas, mais bon le gc est là pour cela et semble le faire très bien.

    bye

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

Discussions similaires

  1. Overrider une classe sous weblogic
    Par sky_striker dans le forum Weblogic
    Réponses: 1
    Dernier message: 13/07/2007, 11h22
  2. [POO] Réalisation de classe sous PHP5 pour plus de lisibilité
    Par ChriGoLioNaDor dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2007, 20h42
  3. Plantage lors de la destruction d'une classe
    Par xwindoo dans le forum C++
    Réponses: 10
    Dernier message: 04/10/2006, 17h01
  4. Réponses: 4
    Dernier message: 23/04/2006, 11h36
  5. destruction d'une classe qui herite de CDialog
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 03/02/2004, 18h39

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