Propriétés dynamique + arrayIterator

ViPHP
ViPHP | 928 Messages

04 août 2008, 16:00

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]

ViPHP
ViPHP | 5924 Messages

04 août 2008, 16:24

Le ArrayIterator c'est site ou config ?

ViPHP
ViPHP | 928 Messages

04 août 2008, 16:26

Le arrayIterator c'est site, et il peut y avoir autant de descendants que tu veux (comme simpleXML).

Mammouth du PHP | 1668 Messages

04 août 2008, 16:30

J'ai pas la solution directement, mais, si tu implémente la notion de surcharge, n'arriverais-tu point à tes fins ?
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 928 Messages

04 août 2008, 16:33

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].

ViPHP
ViPHP | 5924 Messages

04 août 2008, 16:38

J'ai un petit doute que cela donne quelquechose, mais {$test->$test2}[0] ne donne pas de Parse error.

ViPHP
ViPHP | 928 Messages

06 août 2008, 10:48

J'ai trouvé une solution, en passant par une méthode au lieu de passer par des propriétés dynamiques.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

06 août 2008, 11:24

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.