2010-09-29 2 views
2

Так что я хочу, чтобы расширить, например, это RecursiveIterator from the SPL с функцией каждого, так что я могу легко идти по объекту/массивКак передать переменную по ссылке при создании объекта в 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; 
}); 

что приводит к:

Запрещены: время вызова перейти по ссылке устарела в ...

проблема в том, я не могу, или не должны использовать ссылку, когда creati объект, потому что он лишен. Но когда итерации по массиву/объекту я хочу иметь возможность вносить в него изменения, как я могу достичь этого, не меняя allow_call_time_pass_reference на On? Я использую wamp с php 5.3.

имеют хороший день

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

+0

Вы можете использовать 'each' метод при расширении' RecursiveArrayIterator'? У меня сложилось впечатление, что вы унаследовали предыдущие методы, и в этом случае «каждый» не является одним из них, в соответствии с: http://www.php.net/~helly/php/ext/spl/classRecursiveArrayIterator.html –

+0

@Russell: вы можете не только перезаписывать, но и добавлять методы в производные классы (в противном случае не было бы класса с большим количеством методов, чем StdClass, который имеет 0 методов ;-)) – VolkerK

+0

Извините, это было просто недоразумение с моей стороны. По какой-то причине я думал, что он реализует, а не расширяется из «РекурсивныйArrayIterator». Спасибо за разъяснения! –

ответ

1

Вам нужно будет изменить конструктор, чтобы взять переменную по ссылке; но это невозможно, потому что, даже если вы изменили конструктор для своего класса, вам все равно придется вызвать родительский конструктор, который не берется ссылкой.

Решение должно включать изменение подписи ArrayIterator::__construct для получения массива по ссылке.

В принципе, вы могли бы переопределить ограничение по времени захода на вызов с помощью call_user_func_array, однако это не работает с внутренними функциями (в данном случае ArrayIterator::__construct); см. bug #52940.

Это делает не работы:

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

Там не является очевидным способом для достижения этой цели. RecursiveArrayIterator наследует от ArrayIterator со следующим прототипом конструктора: ArrayIterator::__construct($array, $flags = 0)

Это означает, что аргумент не передается по ссылке. И если я правильно помню, вам не разрешено менять подпись, чтобы принимать параметры by-ref.

Смежные вопросы