JeuWeb - Crée ton jeu par navigateur
[PHP] Demande de précision sur unset - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [PHP] Demande de précision sur unset (/showthread.php?tid=5530)



[PHP] Demande de précision sur unset - Ter Rowan - 05-07-2011

coucou

je me pose certainement un problème qui n'en est pas un cependant j ai un peu peur de fuite mémoire (ou du moins de consommation inutile de mémoire, le temps que le script se termine)

dans un objet, j'ai un tableau de références à d'autres objets.
je veux au cours d'un traitement, vider ce tableau (et supprimer tous les objets qui le composent, ceux ci n'étant référencer nul par ailleurs)
Puis le remplacer par un autre.

j'aimerais savoir si je m'y prend bien, ou si je dois parcourir mon tableau pour "unseter" tous les objets un par un

Pour exemple, un code que je n'ai pas encore tester qui doit me permettre de construire une sorte d'arbre de décision

Code :
class globalScenarii extends classRoot
{
    protected $_scenarii = array();    // tableau de globalscenario

    // ajoute un niveau supplémentaire à mon arbre : pour chaque feuille ($this->_scenarii) je multiplie les feuilles par la liste de scenarii passée en paramètre ($scenarii)
    public function AddConstraint($scenarii)
    {
        $newScenarii = array();
        foreach ( $this->_scenarii as $globalScenario)
        {
            foreach ( $scenarii as $scenario)
            {
                $newScenario = clone $globalScenario; // je clone ma feuille autant de fois que nécessaire
                $newScenario->Add($scenario); // j'y ajoute ce qui va bien
                $newScenarii[] =$newScenario; // je garde en mémoire le résultat
            }
        }

        unset($this->_scenarii); // suppression (j espère de tout ?)
        $this->_scenarii = $newScenarii; // nouvelle attribution
    }
}

n'hésitez pas à me dire si vous voyez une manière plus propre de manipuler l'arbre

grosso modo le comportement doit être

j'ai une feuille originelle O
elle se transforme en 3 feuilles (car 3 scenarii) :
A1
A2
A3

puis j'ai deux nouveaux scenarii pour le niveau supplémentaire, j'obtiens alors 6 feuilles :
A1 + B1
A1 + B2
A2 + B1
A2 + B2
A3 + B1
A3 + B2

etc...


RE: demande de précision sur unset - niahoo - 05-07-2011

heu j'ai pas tout saisi mais si tu veux vérifier que les objets sont bien détruits, utilise la fonction __destruct() dans la classe de ces objets pour faire un petit echo "ciao";


RE: demande de précision sur unset - Ter Rowan - 05-07-2011

(05-07-2011, 07:43 PM)niahoo a écrit : heu j'ai pas tout saisi mais si tu veux vérifier que les objets sont bien détruits, utilise la fonction __destruct() dans la classe de ces objets pour faire un petit echo "ciao";

c'est pas con ça ^^ j y aurais pas pensé


RE: demande de précision sur unset - archANJS - 06-07-2011

Lorsque tu utilise la fonction unset($this->_scenarii);, la variable au complet est supprimée. Donc la façon que tu l'utilise est parfaite.

Là où tu aurais eu des problèmes c'est, par exemple, si tu avais utilisé une fonction (au lieu d'une classe) pour supprimer ta variable... La variable dans la fonction aurait été supprimé, mais pas la variable dans ta page, donc cela aurait pu te causer des problèmes. Mais ce n'est pas le cas donc^^

Étais-ce cela ta question ?


RE: demande de précision sur unset - Ter Rowan - 06-07-2011

(06-07-2011, 06:38 PM)archANJS a écrit : Etais-ce cela ta question ?

le problème principal vient du fait que c'est un tableau de références et non d'entier / chaine. Référence qui plus est sur des objets que je clone... C'est là où j'ai peur que se perde des infos. Mais de ma connaissance, je suis d'accord avec toi Smile


RE: demande de précision sur unset - ToraTora - 06-07-2011

Tu peux utiliser la fonction
Code :
memory_get_usage(1)
http://php.net/manual/fr/function.memory-get-usage.php

pour tester si tes objets sont bien détruits.
Tu fais un appel à cette fonction avant et après pour comparer l'utilisation de la mémoire.

Mais tu utilises correctement le unset() Wink