所以我想用这个函数扩展这个RecursiveIterator from the 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
的情况下实现此目的?我正在使用php 5.3。
度过愉快的一天
1:http://www.php.net/manual/en/class.recursivearrayiterator.phpin ...
答案 0 :(得分:1)
没有明显的方法可以实现这一目标。 RecursiveArrayIterator
使用以下构造函数原型继承ArrayIterator
:ArrayIterator::__construct($array,
$flags = 0)
这意味着参数不会通过引用传递。如果我没记错的话,你不能改变签名来接受para-by参考。
答案 1 :(得分:1)
您必须更改构造函数以通过引用获取变量;但这在这里是不可能的,因为即使你改变了类的构造函数,你仍然必须调用父构造函数,而不是通过引用。
解决方案必须涉及更改ArrayIterator::__construct
的签名以通过引用接收数组。
原则上,您可以使用call_user_func_array
覆盖调用时传递参数限制,但这不适用于内部函数(在本例中为ArrayIterator::__construct
);见bug #52940。
不工作:
public function __construct(&$array) {
call_user_func_array('parent::__construct', array(&$array));
}