Как передать переменную по ссылке при создании объекта в php - PullRequest
2 голосов
/ 29 сентября 2010

Итак, я хочу расширить, например, этот RecursiveIterator из SPL с помощью каждой функции, чтобы я мог легко пройтись по объекту / массиву

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;
});

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

устарело: передача по времени вызова устарела в ...

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

Хорошего дня

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

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

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

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

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

Это не работа:

public function __construct(&$array) {
    call_user_func_array('parent::__construct', array(&$array));
}
1 голос
/ 29 сентября 2010

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

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

...