2010-09-29 5 views
2

Je veux étendre par exemple ce RecursiveIterator from the SPL avec la fonction each afin que je puisse facilement marcher sur l'objet/tableauComment passer une variable par référence lors de la création d'un objet en php

class it extends RecursiveArrayIterator { 
    public function each($function, $args=array()){ 
     $args = (sizeof($args)>0) ? array_merge(array($this),(array)$args) : array($this); 
     iterator_apply($this, $function, $args); 
     return $this; 
    } 
} 
//Running it: 
$it = new it(&$array); 
$it->each(function($it){ 
    $it->offsetSet($it->key(), $it->current() + 1); 
    return true; 
}); 

qui se traduit par:

obsolète: passage par référence Call-temps a été dépréciée en ...

le problème est que je ne peux pas, ou ne devrait pas, utiliser la référence quand creati ng l'objet car il est déprécié. Mais lorsque vous itérez sur le tableau/l'objet que je veux pouvoir modifier, comment puis-je y parvenir sans changer le allow_call_time_pass_reference en On? J'utilise wamp avec php 5.3.

Avoir une belle journée

1: http://www.php.net/manual/en/class.recursivearrayiterator.phpin ...

+0

Peut-on utiliser la méthode 'each' lors de l'extension' RecursiveArrayIterator'? J'avais l'impression que vous avez hérité des méthodes précédentes, auquel cas 'each' n'en fait pas partie, selon: http://www.php.net/~helly/php/ext/spl/classRecursiveArrayIterator.html –

+0

@Russell: Vous pouvez non seulement écraser mais aussi ajouter des méthodes dans les classes dérivées (sinon il n'y aurait pas de classe avec plus de méthodes que StdClass, qui a 0 méthodes ;-)) – VolkerK

+0

Désolé, c'était juste un malentendu de ma part. Pour une raison quelconque, je pensais qu'il implémente plutôt que de s'étendre à partir de 'RecursiveArrayIterator'. Merci pour la clarification! –

Répondre

1

Vous devrez changer le constructeur pour prendre la variable par référence; mais ce n'est pas possible ici, car même si vous avez changé le constructeur de votre classe, vous devrez toujours appeler le constructeur parent, qui ne le prend pas par référence.

La solution devrait impliquer de changer la signature de ArrayIterator::__construct pour recevoir le tableau par référence.

En principe, vous pouvez remplacer la limitation de la référence de passage au temps de l'appel par call_user_func_array, mais cela ne fonctionne pas avec les fonctions internes (dans ce cas, ArrayIterator::__construct); voir bug #52940.

Cela ne pas travail:

public function __construct(&$array) { 
    call_user_func_array('parent::__construct', array(&$array)); 
} 
1

Il n'y a pas une façon évidente d'y parvenir. Le RecursiveArrayIterator hérite de ArrayIterator avec le prototype de constructeur suivant: ArrayIterator::__construct($array, $flags = 0)

Cela signifie que l'argument n'est pas transmis par référence. Et si je me souviens bien, vous n'êtes pas autorisé à passer à la signature pour accepter les paramètres par réf.

Questions connexes