destruction d'objet

devlop78
Invité n'ayant pas de compte PHPfrance

02 août 2010, 15:13

Bonjour,

La question peut paraître bête, mais vue qu'une variable qui contient un objet contient sa référence mémoire, comment détruire l'instance ?

Ex :

$machin = new objet();
$machin2 = $machin;

comment détruire l'objet ? Car si je fais unset ($machin) ou unset($machin2), je ne suis pas sûr que l'objet soit détruit, et ça ne serait pas forcément logique. De plus, il est impensable de détruire toutes les variables qui possède la référence de l'instance objet (dans ce dernier cas, j'imagine que le garbage collector se chargerait de détruire l'objet), car j'utilise beaucoup singleton et la plupart de mes classes, dans leur contructeur et/ou dans leurs méthodes créent des $this->machin = objet::getInstance(); ce qui provoque pas mal de variables possédant la même référence mémoire ...

Voili Voilou :)

PS : Si en même temps vous connaissez Flash, est-ce que un removeChild() libère la mémoire (même question en fait).

Petit nouveau ! | 8 Messages

02 août 2010, 18:48

Bonsoir,
pour détruire un objet, une variable ou une ressource on utilise unset($obj) où $obj est ta variable ou ton instance d'objet.
Nota même si cela fonctionne aussi pour libérer un handle de fichier, utiliser de préférence fclose($handle) par exemple que unset($handle) pour des raison de lisibilité. enfin c'est mon point de vue.
Nota : attention je ne suis pas un expert, je débute depuis 15 jours seulement en php ....

Petit nouveau ! | 8 Messages

02 août 2010, 19:12

excuse je n'avais lu que le début de ta question ...
Pour compléter en fait, unset($var) ne fait que pointer la zone pour le garbage collector. De plus il y a quelques exceptions notamment dans le cas d'une variable statique ou seule la variable de ton instance sera libérée. Idem pour les références circulaire ou unset seul est inopérant. En résumé il me semble que j'essaierai ceci pour ta problématique pour m'assurer de la libération mémoire.
$myclass = new(Myclass);
........
..
// appel du destructeur puis de la fonction unset().
$myclass->__destruct();
unset($myclass);

// pour vérifier l'utilisation mémoire de Php entre les étapes :
echo number_format(memory_get_usage())

à tester ...

devlop78
Invité n'ayant pas de compte PHPfrance

02 août 2010, 20:54

Mouai ....

Enfin, d'après ce que tu dis, si j'ai 30 variables qui possède la référence à mon objet, un unset sur l'un détruira l'objet. C'est violent quand même ... d'autant que l'on voit dans le manuel de php que unset sur une variable globale dans une fonction, ne détruit que la variable locale à la fonction ... bref, je ne suis pas convaincu ...

Je vais certainement réinstaller Wamp d'ici peu, je ferai quelques tests ...

ViPHP
ViPHP | 5462 Messages

03 août 2010, 00:18

contrairement a flash quand ton script est finis la mémoire est vidé, donc a par si au début de ton script tu charge un gros fichier et que t'as besoin de mémoire pour faire autre chose vide la mémoire sert pas a grand chose, je te conseil d'utilisé un profiler (xdebug + webgrind) pour voir la mémoire que consomme tes scripts :wink:

devlop78
Invité n'ayant pas de compte PHPfrance

03 août 2010, 01:06

A non mais je te confirme que je n'ai pas l'utilité de détruire les objets ... et mêmes les variables je le fais rarement. Il n'y a que ma classe de connexion à la base de données où j'efface tout à chaque nouvelle requête mais ça c'est falcultatif ... mais j'aurais bien voulu savoir ... et la réponse n'est pas si évende. Puisque apparement, la seule façon de détruire un objet, c'est de détruire toutes les variables qui l'ont comme référence ... et là encore la version de php détermine le garbage coll. M'enfin ...

ViPHP
ViPHP | 5462 Messages

03 août 2010, 01:20

c'est pas des références mais des copies

tu peux faire
$machin = new stdClass();
$machin2 = $machin;

unset($machin, $machin2);

var_dump($machin, $machin2);
$machin2 etant ma copie de $machin, si $machine fait x octet $machin2 fais aussi x octet, j'arrive pas trop a voir ce que tu veux vraiment :?:

devlop78
Invité n'ayant pas de compte PHPfrance

03 août 2010, 01:23

Non ce ne sont pas des copies ... ils ont la même référence ... si ta première variable fait x octets, ta deuxième fait x octets aussi, mais le total fait x octets et non 2x ...

ViPHP
ViPHP | 5462 Messages

03 août 2010, 02:21

simple test
<pre>
<?php
echo xdebug_memory_usage() . "\n";

$machin = 'test';
echo xdebug_memory_usage() . "\n";

$machin2 = $machin;
echo xdebug_memory_usage() . "\n";

unset($machin);
echo xdebug_memory_usage() . "\n";

unset($machin2);
echo xdebug_memory_usage() . "\n";
638240  //début
638504  //$machin = 'test';
638632  //$machin2 = $machin;
638504  //unset($machin);
638240  //unset($machin2);
si t'inverse les unset ca donne la même chose

devlop78
Invité n'ayant pas de compte PHPfrance

03 août 2010, 02:29

Mon sujet concerne les objets, pas les variables string.

ViPHP
ViPHP | 5462 Messages

03 août 2010, 02:35

Mon sujet concerne les objets, pas les variables string.
avec un stdClass()
ca donne

Code : Tout sélectionner

638240 638984 639112 638984 638472
toi tu veux effacer les 232 qui traine ?

devlop78
Invité n'ayant pas de compte PHPfrance

03 août 2010, 02:51

Bon alors je vais répondre en partie à ma propre question

Code : Tout sélectionner

<?php class ESSAI { public function __destruct() { echo "je me détruis "; } } $mavar = new ESSAI; $mavar2=$mavar; unset($mavar); ?> dd
Affiche "dd je me détruis" = destruction en fin d'exécution

si je remplace unset($mavar) par unset($mavar2); le résultat est le même
Si je rajoute unset($mavar2) ... là, j'obtiens "je me détruisdd"

Donc .. ma question reste ... existe-t-il un mot clé (de type clone, class, etc) pour détruire explicitement une instance ?

Merci d'avance

ViPHP
ViPHP | 5462 Messages

03 août 2010, 03:02

non, après c'est la garbage collector qui s'occupe de ca tout seul quand y'a a trop qui traine

pour ca :
Affiche "dd je me détruis" = destruction en fin d'exécution

si je remplace unset($mavar) par unset($mavar2); le résultat est le même
Si je rajoute unset($mavar2) ... là, j'obtiens "je me détruisdd"
il est détruit dans 2 cas, sois quand le refcount est a 0, sois a la fin du script si le refcount est < 0

ViPHP
ViPHP | 3607 Messages

03 août 2010, 11:04

Hop un petit cours sur la question: http://julien-pauli.developpez.com/tuto ... variables/