在php中创建对象时如何通过引用传递变量

时间:2010-09-29 09:45:42

标签: php pass-by-reference

所以我想用这个函数扩展这个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。

度过愉快的一天

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

2 个答案:

答案 0 :(得分:1)

没有明显的方法可以实现这一目标。 RecursiveArrayIterator使用以下构造函数原型继承ArrayIteratorArrayIterator::__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));
}
相关问题