Page 1 sur 1

Propriétés dynamique + arrayIterator

Posté : 04 août 2008, 16:00
par Genova
Hello,
je suis confronté à un problème tordu.

J'ai fait une classe qui implémente arrayIterator, ce qui me permet de gérer des objets de la même façon que simpleXML par exemple, c'est à dire de faire des trucs de ce genre :
$config->site; // La propriété site est un objet. Pointe vers $config->site[0]
$config->site[0]; // Pointe correctement vers $config->site[0]

$config->site->host; // Pointe vers $config->site[0]->host;
$config->site[0]->host; // Point vers $config->site[0]->host
Là où ça se complique c'est que quand je construit cet arbre, je ne connais pas le nom des propriétés. Pour me balader dans l'arbre lors de sa construction, je suis donc obligé d'utiliser des propriétés dynamiques.

Concrètement voilà le problème :
$config->site; // Pointe vers $config->site[0]
Donc si je remplace ça par une variable dynamique :
$dynavar = 'site';
$config->$dynavar; // Pointe toujours vers $config->site[0]
Seulement mon soucis c'est que je veux accéder à $config->site[1].

Bien entendu quand j'essaie :
$dynavar = 'site';
$config->$dynavar[0]; // Pointe sur $config->s (première lettre de site)

// Ou bien
$dynavar = 'site';
$config->{$dynavar}[0]; // parse error
ça ne marche pas ...

Je suis conscient que ce problème est assez tordu, mais auriez vous une idée / solution ?


PS : inutile de me proposer de faire
$dynavar = 'site';
$obj = $config->$dynavar;
$obj = $obj[1];
car lors de la seconde ligne $obj pointera déjà sur $obj[0]

Posté : 04 août 2008, 16:24
par Sékiltoyai
Le ArrayIterator c'est site ou config ?

Posté : 04 août 2008, 16:26
par Genova
Le arrayIterator c'est site, et il peut y avoir autant de descendants que tu veux (comme simpleXML).

Posté : 04 août 2008, 16:30
par katagoto
J'ai pas la solution directement, mais, si tu implémente la notion de surcharge, n'arriverais-tu point à tes fins ?

Posté : 04 août 2008, 16:33
par Genova
C'est déjà le cas, en fait dans une classe implémentant un arrayIterator lorsque tu fais $this->quelquechose il appellera __get(). Cette classe ne comprend que quand tu lui dis $this[0]->quelquechose. Donc en gros ma surcharge s'occupe déjà de faire en sorte que $this pointe sur $this[0].

Posté : 04 août 2008, 16:38
par Sékiltoyai
J'ai un petit doute que cela donne quelquechose, mais {$test->$test2}[0] ne donne pas de Parse error.

Posté : 06 août 2008, 10:48
par Genova
J'ai trouvé une solution, en passant par une méthode au lieu de passer par des propriétés dynamiques.

Posté : 06 août 2008, 11:24
par ouckileou
Modération :
Genova, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.