Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2342 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Destructeur...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Destructeur...

n°1862500
pot2yaourt
Posté le 17-03-2009 à 14:26:11  profilanswer
 

Bonjour à tous,
 
Une petite question concernant le destructeur ( __destruct() ) d'une classe en PHP5.  
 
Est-il obligé de supprimer les attributs de la classe dans le destructeur ou est-ce que le simple fait que l'objet soit détruit, soit par unset(), soit à la fin du script suffise pour qu'il libère, de lui-même, les données stockées dans ses propriétés lorsqu'il exécute le destructeur ?
 
Est-on obligé d'écrire ceci :
 

Code :
  1. <?php
  2. class MyObject
  3. {
  4.     private $myVar;
  5.     public function __construct() { }
  6.     public function doIt() { }
  7.     public function __destruct()
  8.     {
  9.         // code obligatoire ou destruction des propriétés de l'objet faite de façon implicite ??
  10.         unset($this->myVar);
  11.     }
  12. }
  13. ?>


Merci d'avance pour vos réponses !
Lionel.


---------------
On dit que les gens veulent du travail, mais c'est faux ! Etre payé leur suffirait !
mood
Publicité
Posté le 17-03-2009 à 14:26:11  profilanswer
 

n°1862584
skeye
Posté le 17-03-2009 à 16:53:55  profilanswer
 

Le destructeur php n'a à ma connaissance aucune utilité.


---------------
Can't buy what I want because it's free -
n°1862645
Profil sup​primé
Posté le 17-03-2009 à 18:31:22  answer
 

skeye a écrit :

Le destructeur php n'a à ma connaissance aucune utilité.


J'ai lu dans un bouquin que c'était bien pour "fermer" des fichiers/connexions sql.
Sauf que j'ai jamais de ressources propre à une classe. Donc, oui, je ne vois pas non plus d'utilité à destruct :??:

n°1862646
masklinn
í dag viðrar vel til loftárása
Posté le 17-03-2009 à 18:33:12  profilanswer
 

skeye a écrit :

Le destructeur php n'a à ma connaissance aucune utilité.


Fermer les ressources non GC'd qui vont potentiellement leaker (je sais pas si PHP ferme automagiquement tous ses fichiers à la fin d'un script par exemple, ou toutes ses connections SQL) comme dans tous les languages avec GC :D

Message cité 1 fois
Message édité par masklinn le 17-03-2009 à 18:33:28

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1862657
skeye
Posté le 17-03-2009 à 18:45:19  profilanswer
 

masklinn a écrit :


Fermer les ressources non GC'd qui vont potentiellement leaker (je sais pas si PHP ferme automagiquement tous ses fichiers à la fin d'un script par exemple, ou toutes ses connections SQL) comme dans tous les languages avec GC :D


il est censé le faire tout seul. Bon après c'est php, hein...[:joce]


---------------
Can't buy what I want because it's free -
n°1862658
masklinn
í dag viðrar vel til loftárása
Posté le 17-03-2009 à 18:53:48  profilanswer
 

skeye a écrit :


il est censé le faire tout seul. Bon après c'est php, hein...[:joce]


Qu'il ferme les fichiers est probable remarque, par contre les connections SQL il ferme probablement les connections TCP mais pas nécessairement correctement, ça peut faire leaker des handlers au niveau du serveur même (me semble avoir vu ça, à vérifier)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1863428
pot2yaourt
Posté le 19-03-2009 à 10:09:03  profilanswer
 

masklinn a écrit :


Qu'il ferme les fichiers est probable remarque, par contre les connections SQL il ferme probablement les connections TCP mais pas nécessairement correctement, ça peut faire leaker des handlers au niveau du serveur même (me semble avoir vu ça, à vérifier)


Pour fermer la connexion à la base de données, voici comment j'opère avec le desctructeur :

 
Code :
  1. <?php
  2. class DB
  3. {
  4.     public function __construct($host, $user, $pwd, $base) { ... }
  5.     private function connect() { ... }
  6.     public function disconnect()
  7.     {
  8.         //ferme la connexion à la base de données
  9.     }
  10.     public function __destruct()
  11.     {
  12.         //ferme la connexion à la bdd dans tous les cas, du coup je n'appelle jamais la méthode disconnect()
  13.         $this->disconnect();
  14.     }
  15. }
  16. ?>


Message édité par pot2yaourt le 19-03-2009 à 10:09:44

---------------
On dit que les gens veulent du travail, mais c'est faux ! Etre payé leur suffirait !
n°1863491
skeye
Posté le 19-03-2009 à 12:18:11  profilanswer
 

J'espère que tu testes si la connexion est ouverte avant de la fermer, sinon tu risques d'avoir un message d'erreur idiot.:D


---------------
Can't buy what I want because it's free -
n°1863775
pot2yaourt
Posté le 19-03-2009 à 19:34:12  profilanswer
 

skeye a écrit :

J'espère que tu testes si la connexion est ouverte avant de la fermer, sinon tu risques d'avoir un message d'erreur idiot.:D


 
Vi vi ! ;)


---------------
On dit que les gens veulent du travail, mais c'est faux ! Etre payé leur suffirait !
n°1863837
PunkRod
Digital Mohawk
Posté le 19-03-2009 à 23:04:48  profilanswer
 

Je l'ai utilisé dans une classe utilisant cURL : je supprimais le cookie automatiquement par ce biais.
 
d'ailleurs, il est amusant de voir qu'on ne peut pas attraper les exceptions levées par des destructeurs (ou alors je m'y suis pris comme un manche)

mood
Publicité
Posté le 19-03-2009 à 23:04:48  profilanswer
 

n°1863853
skeye
Posté le 20-03-2009 à 07:49:39  profilanswer
 

PunkRod a écrit :

d'ailleurs, il est amusant de voir qu'on ne peut pas attraper les exceptions levées par des destructeurs (ou alors je m'y suis pris comme un manche)


J'ai jamais trouvé amusant d'être surpris par quelque chose qui est indiqué clairement dans la doc :D
 
http://www.php.net/manual/en/language.oop5.decon.php

Citation :

Note: Attempting to throw an exception from a destructor (called in the time of script termination) causes a fatal error.


---------------
Can't buy what I want because it's free -
n°1915551
CristianP
Posté le 17-08-2009 à 00:00:26  profilanswer
 

Le destructeur est également pratique avec une calss utilisant la bibliothèque GD, qui fait souvent appel à la fonction imagedestroy().
 
Exemple:
 

Code :
  1. <?php
  2. class Image
  3.     {
  4.     public $img;
  5.    
  6.     function __construct()
  7.         {
  8.         // Création de l'image
  9.         $this->img = imagecreatetruecolor(400, 30);
  10.         }
  11.        
  12.     public function avecDuText($text)                //    Pour des explications sur cette fonction : http://fr.php.net/imagettftext
  13.         {
  14.         // Création de quelques couleurs
  15.         $white = imagecolorallocate($this->img, 255, 255, 255);
  16.         $grey = imagecolorallocate($this->img, 128, 128, 128);
  17.         $black = imagecolorallocate($this->img, 0, 0, 0);
  18.         imagefilledrectangle($this->img, 0, 0, 399, 29, $white);
  19.         // Chemin de la police du text
  20.         $font = 'arial.ttf';
  21.         // Ajout d'ombres au texte
  22.         imagettftext($this->img, 20, 0, 11, 21, $grey, $font, $text);
  23.         // Ajout du texte
  24.         imagettftext($this->img, 20, 0, 10, 20, $black, $font, $text);
  25.         // Affiche l'image
  26.         header('Content-type: image/png');
  27.         imagepng($this->img);       
  28.         }
  29.        
  30.        
  31.     public function avecDesJolisDessins()
  32.         {
  33.         /*    script ici    */
  34.         }
  35.        
  36.     /*
  37.     d'autres fonctions ici
  38.     ...
  39.     */
  40.    
  41.     function __destruct()
  42.         {    // Détruit l'image en fin de script, quel que soit la fonction que vous utilisé dans votre class (avecDuText(), avecDesJolisDessins(), etc.)
  43.         imagedestroy($this->img);
  44.         }
  45.     }
  46.    
  47. $Image = new Image;
  48. $Image->avecDuText('Votre text ici');
  49. ?>


Message édité par CristianP le 17-08-2009 à 00:02:25

---------------
www.CropCirclesDataBase.org
n°1915706
stealth35
Posté le 17-08-2009 à 13:13:00  profilanswer
 


 
d'autant plus qu'une connexion classique mysql, se ferme automatiquement

n°1915726
Profil sup​primé
Posté le 17-08-2009 à 14:07:37  answer
 

sauf qu'on peut vouloir la fermer avant la fin du script


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Destructeur...

 

Sujets relatifs
new & delete customisé et destructeur qui foireheap corruption detected dans le destructeur de CStringT
appel du destructeur et opérateurs[C++] Destructeur ? Comprends pas..
destructeur de classeClasse virtuelle pure & destructeur
déstructeur de cookies ???[Résolu] Appel de destructeur après avoir utilisé une dll
Redefinir le destructeur ou destructeur par defaut?Constructeur destructeur probleme avec heritage
Plus de sujets relatifs à : Destructeur...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR