Suicider un objet ?

Suicider un objet ? - PHP - Programmation

Marsh Posté le 25-03-2008 à 21:46:33    

youp,
 
 
est-ce possible de faire se suicider un objet en php ?
 
Le but est que si mon objet n'est plus utile, il le sait de lui même et s'auto unset.
 
 
Marchi :)


---------------
oui oui
Reply

Marsh Posté le 25-03-2008 à 21:46:33   

Reply

Marsh Posté le 25-03-2008 à 23:37:16    

Sa durée de vie n'excède pas le chargement de ta page de toutes façons, sauf si tu le garde en session, cookie, ... tu n'as qu'a le détruire si c'est le cas.

Reply

Marsh Posté le 26-03-2008 à 09:10:46    

art_dupond a écrit :

youp,
 
 
est-ce possible de faire se suicider un objet en php ?
 
Le but est que si mon objet n'est plus utile, il le sait de lui même et s'auto unset.
 
 
Marchi :)


C'est le rôle du garbage collector [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 26-03-2008 à 11:18:59    

masklinn a écrit :

C'est le rôle du garbage collector [:spamafote]


Voilà. Et y'a même la gestion des destructeurs [:dawa]
 
Genre :

Code :
  1. class MyClass {
  2.   public function __destruct()
  3.   {
  4.      // Nettoyage additionnel
  5.   }
  6. }

Reply

Marsh Posté le 26-03-2008 à 11:59:36    

FlorentG a écrit :


Voilà. Et y'a même la gestion des destructeurs [:dawa]
 
Genre :

Code :
  1. class MyClass {
  2.   public function __destruct()
  3.   {
  4.      // Nettoyage additionnel
  5.   }
  6. }



 
Garbage collector, en gros en français c'est la benne à ordures  :pt1cable:  :jap:


---------------
http://www.ypikay.com
Reply

Marsh Posté le 26-03-2008 à 12:02:25    

FlorentG a écrit :


Voilà. Et y'a même la gestion des destructeurs [:dawa]
 
Genre :

Code :
  1. class MyClass {
  2.   public function __destruct()
  3.   {
  4.      // Nettoyage additionnel
  5.   }
  6. }



Ouais mais ça c'est quasiment jamais utile, en java il est même déconseillé de l'utiliser. Pareil en Python d'ailleurs, parce que ça interdit au détecteur de cycle de tourner correctement


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 26-03-2008 à 12:32:13    

Fused a écrit :

Sa durée de vie n'excède pas le chargement de ta page de toutes façons, sauf si tu le garde en session, cookie, ... tu n'as qu'a le détruire si c'est le cas.


Oui l'objet est en session.
 
En fait, l'objet se crée sur une page "particulière", vit le temps de quelques pages (en fonction d'un paramètre $ttl qui diminue à chaque changement de page) et est détruit quand ($ttl == 0)
 
Pour l'instant, sur chaque page, je fais
 

Code :
  1. if ($Obj->TTL() <= 0) unset($Obj)


 
et j'aimerais pouvoir faire (oui ça ne change pas grand chose, mais c'est aussi pour apprendre :))
 

Code :
  1. $Obj->AutoUnset() // détruit l'objet si ($ttl <= 0)


 
:)
 
 
C'est faisable avec le gc ça ? Je pensais que le gc était un "truc automatique" (mais bon, je connais pas bien ;))
 
 
 
 
ps: j'ai bien essayé avec __destruct, mais si j'ai bien compris, c'est juste une fonction qui est appelée quand on unset l'objet (:??:)
pps: pour le gc, j'aurais besoin d'un peu d'aide si c'est faisable avec, je ne trouve rien de concret pour mon truc :(


---------------
oui oui
Reply

Marsh Posté le 26-03-2008 à 13:33:23    

En principe tu fais un truc du style :
$objet->__destruct();
$objet = null;


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 26-03-2008 à 13:37:09    

CyberDenix a écrit :

En principe tu fais un truc du style :
$objet->__destruct();
$objet = null;


sûrement pas.
 

Citation :

The destructor method will be called as soon as all references to a particular object are removed or when the object is explicitly destroyed or in any order in shutdown sequence.


http://fr2.php.net/manual/en/language.oop5.decon.php
 
Le destructeur est appelé automatiquement quand le GC dégage l'objet, e.g. après l'unset.
 
Mais dans tous les cas, ça ne permet pas de faire ce que art_dupond demande, qui n'est pas possible.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 26-03-2008 à 14:04:55    

oki merci :jap:


---------------
oui oui
Reply

Marsh Posté le 26-03-2008 à 14:04:55   

Reply

Marsh Posté le 26-03-2008 à 14:27:39    

masklinn a écrit :

Le destructeur est appelé automatiquement quand le GC dégage l'objet, e.g. après l'unset.


Et à cause du GC de type refcount, ça ne sert même pas en cas de références circulaires :/
 

Code :
  1. class A
  2. {
  3.    public $b;
  4. }
  5.  
  6. class B
  7. {
  8.    public $a;
  9. }
  10.  
  11. $a = new A();
  12. $b = new B();
  13.  
  14. $a->b =& $b;
  15. $b->a =& $a;
  16.  
  17. xdebug_debug_zval('a', 'b');
  18.  
  19. unset($a);
  20.  
  21. xdebug_debug_zval('a', 'b');


 
Donne
 

Code :
  1. a:
  2. (refcount=2, is_ref=1),
  3. object(A)[1]
  4.   public 'b' => (refcount=2, is_ref=1),
  5.     object(B)[2]
  6.       public 'a' => (refcount=2, is_ref=1),
  7.         &object(A)[1]
  8. b:
  9. (refcount=2, is_ref=1),
  10. object(B)[2]
  11.   public 'a' => (refcount=2, is_ref=1),
  12.     object(A)[1]
  13.       public 'b' => (refcount=2, is_ref=1),
  14.         &object(B)[2]
  15. b:
  16. (refcount=2, is_ref=1),
  17. object(B)[2]
  18.   public 'a' => (refcount=1, is_ref=0),
  19.     object(A)[1]
  20.       public 'b' => (refcount=2, is_ref=1),
  21.         &object(B)[2]


 
Donc unset ne fait déréférencer la variable que dans le scope local [:moule_bite]

Reply

Marsh Posté le 26-03-2008 à 14:39:39    

FlorentG a écrit :


Et à cause du GC de type refcount, ça ne sert même pas en cas de références circulaires :/
 

Code :
  1. class A
  2. {
  3.    public $b;
  4. }
  5.  
  6. class B
  7. {
  8.    public $a;
  9. }
  10.  
  11. $a = new A();
  12. $b = new B();
  13.  
  14. $a->b =& $b;
  15. $b->a =& $a;
  16.  
  17. xdebug_debug_zval('a', 'b');
  18.  
  19. unset($a);
  20.  
  21. xdebug_debug_zval('a', 'b');


 
Donne
 

Code :
  1. a:
  2. (refcount=2, is_ref=1),
  3. object(A)[1]
  4.   public 'b' => (refcount=2, is_ref=1),
  5.     object(B)[2]
  6.       public 'a' => (refcount=2, is_ref=1),
  7.         &object(A)[1]
  8. b:
  9. (refcount=2, is_ref=1),
  10. object(B)[2]
  11.   public 'a' => (refcount=2, is_ref=1),
  12.     object(A)[1]
  13.       public 'b' => (refcount=2, is_ref=1),
  14.         &object(B)[2]
  15. b:
  16. (refcount=2, is_ref=1),
  17. object(B)[2]
  18.   public 'a' => (refcount=1, is_ref=0),
  19.     object(A)[1]
  20.       public 'b' => (refcount=2, is_ref=1),
  21.         &object(B)[2]


 
Donc unset ne fait déréférencer la variable que dans le scope local [:moule_bite]


heuuu...
encore heureux, unset ça dégage la référence qu'on lui demande de dégager, pas une autre au pif comme ça tac tac, même pour PHP ça atteindrait des sommets d'imbécilité [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 26-03-2008 à 15:04:01    

masklinn a écrit :


heuuu...
encore heureux, unset ça dégage la référence qu'on lui demande de dégager, pas une autre au pif comme ça tac tac, même pour PHP ça atteindrait des sommets d'imbécilité [:pingouino]


C'était du point de vue de ce que t'as dis : le GC qui appelle le destructeur après un unset.

Reply

Sujets relatifs:

Leave a Replay

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