Destructeur...

Destructeur... - PHP - Programmation

Marsh Posté le 17-03-2009 à 14:26:11    

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 !
Reply

Marsh Posté le 17-03-2009 à 14:26:11   

Reply

Marsh Posté le 17-03-2009 à 16:53:55    

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


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-03-2009 à 18:31:22    

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 :??:

Reply

Marsh Posté le 17-03-2009 à 18:33:12    

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
Reply

Marsh Posté le 17-03-2009 à 18:45:19    

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 -
Reply

Marsh Posté le 17-03-2009 à 18:53:48    

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
Reply

Marsh Posté le 19-03-2009 à 10:09:03    

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 !
Reply

Marsh Posté le 19-03-2009 à 12:18:11    

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 -
Reply

Marsh Posté le 19-03-2009 à 19:34:12    

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 !
Reply

Marsh Posté le 19-03-2009 à 23:04:48    

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)

Reply

Marsh Posté le 19-03-2009 à 23:04:48   

Reply

Marsh Posté le 20-03-2009 à 07:49:39    

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 -
Reply

Marsh Posté le 17-08-2009 à 00:00:26    

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
Reply

Marsh Posté le 17-08-2009 à 13:13:00    


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

Reply

Marsh Posté le 17-08-2009 à 14:07:37    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed