JeuWeb - Crée ton jeu par navigateur
unset de tableau de tableaux... rassurez moi - 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 : unset de tableau de tableaux... rassurez moi (/showthread.php?tid=4797)



unset de tableau de tableaux... rassurez moi - Ter Rowan - 07-05-2010

Hello
je crains d'avoir de mauvaises croyances sur le unset aussi, pouvez vous me dire si un exemple du code que je produis donne le bon comportement (je crains surtout de laisser en mémoire des éléments inutiles après mon unset)

Code PHP :
<?php 
class consommation
{
protected
$_conso = array(); // la consommation standard
protected $_consoByActeur = array(); //la consommation pour un acteur, fonction de ses spécificités

/* je définis une consommation spécifique à mon acteur */
/* pour un même acteur, on peut envoyer plusieurs modifications qui se cumulent*/
public function setConsoByActeur($idActeur, $modifs)
{

//potentiellement il n'a pa
if( !isset($this->_consoByActeur[$idActeur]) )
$this->_consoByActeur[$idActeur] = $this->_conso;
foreach (
$this->_consoByActeur[$idActeur] AS $cle => $valeur)
{
$this->_consoByActeur[$idActeur][$cle] = $valeur * $modif[$cle]; // formule potentiellement plus compliquée

}
}
/* j'annule la spécificité de mon acteur */
public function unsetConsoByActeur($idActeur)
{
unset(
$this->_consoByActeur[$id]);
}
}

et donc la question : est ce que j'efface correctement mon tableau des consommations spécifiques d'un acteur, est ce que j en oublie, est ce que j'en efface trop (à cause du $this->_consoByActeur[$idActeur] = $this->_conso; ) ?

merci d'avance !


RE: unset de tableau de tableaux... rassurez moi - jo_link_noir - 08-05-2010

Salut,

Unset va juste supprimé la variable demandé : la consommation de l'acteur. Et _conso ne sera pas modifier, c'est 2 variables différentes.

Au passage, tu peux récupéré les variables par référence dans le foreach

foreach ($this->_consoByActeur[$idActeur] AS $cle => &$valeur)
{
$valeur *= $modif[$cle]; // formule potentiellement plus compliquée
}
//unset($valeur); //supprime la référence mais pas le contenu qui ce trouve dans $this->_consoByActeur[$idActeur][$cle]
Faudra juste ne pas réutilisé $valeur au risque de changé la valeur de la dernière référence (à moins de faire unset($valeur); pour la supprimé ;o))
EDIT : trouvé ça sur la doc à propos du foreach


RE: unset de tableau de tableaux... rassurez moi - Ter Rowan - 10-05-2010

merci pour ton intervention et désolé pour le retard de ma réponse j'étais en week end sans internet pour une fois ^^

donc ok pour la préservation de _conso, je m'en doutais un peu, mais une confirmation est toujours "apaisante"


par contre, je n'ai peut être pas compris mais je ne vois pas si le unset nettoie bien tout.
Je vais refaire avec un exemple plus basique maintenant

soit :
$a[0][0] = new toto(50);
$a[1][0] = new toto(150);
$a[2][0] = new toto(250);
$a[0][1] = new toto(350);
$a[1][1] = new toto(450);
$a[2][1] = new toto(550);


si je fais unset($a[1]) par exemple

en interrogeant $a je verrais

$a[0][0] = toto50; // un objet quelconque
$a[2][0] = toto250;
$a[0][1] = toto350;
$a[2][1] = toto550;

d'un point de vue programme, je ne sais plus accèder à "toto 150 et toto 250" (imaginons pas de copie n'y rien)

mais est ce que pour autant les zones mémoires qui stockent toto150 et toto450 ont bien été vidées et sont réutilisables ?

J'ai de vieilles résurgences quand j'apprenais le C il y a dix ans, je me pose peut être des problèmes qui n'ont plus de sens avec les langages "plus récents"


RE: unset de tableau de tableaux... rassurez moi - jo_link_noir - 11-05-2010

Salut,
Ouais, c'est pas comme en c avec les pointeurs Smile.

Pour cet exemple basique toto 150 et toto 250 vont disparaitre, plus aucune variables ne pointent sur eux donc leurs destructeurs seront appelés et bye bye les totos ^-^.
Y aura juste un problème dans le cas ou un objet A contient un objet B qui contient le même objet A. Avec un unset les 2 objets n'auront plus aucunes variables qui les désignes, mais ils ne seront pas supprimés. Si tu veux je te montre un exemple ?


RE: unset de tableau de tableaux... rassurez moi - Ter Rowan - 12-05-2010

(11-05-2010, 11:43 PM)jo_link_noir a écrit : Salut,
Ouais, c'est pas comme en c avec les pointeurs Smile.

Pour cet exemple basique toto 150 et toto 250 vont disparaitre, plus aucune variables ne pointent sur eux donc leurs destructeurs seront appelés et bye bye les totos ^-^.
Y aura juste un problème dans le cas ou un objet A contient un objet B qui contient le même objet A. Avec un unset les 2 objets n'auront plus aucunes variables qui les désignes, mais ils ne seront pas supprimés. Si tu veux je te montre un exemple ?

non pour cet exemple c est bon Smile, j ai déjà vu un post sur cette référence circulaire, faut juste espérer qu'ils soient détruits à la fin du script proprement ^^