编程语言
首页 > 编程语言> > php-通过引用方法传递对象数组

php-通过引用方法传递对象数组

作者:互联网

我的课堂上有一个方法可以通过引用接受对象.它装饰该对象以扩展功能.

基本上…

public function addObject( &$object ) {
    $object = $this->decorate( $object );
}

我正在尝试编写一个方便的方法addObjects(),但它没有更改$object

这行不通…

public function addObjects( array &$objects ) {
    foreach( $objects as $object ) {
        $this->addObject( $object );
    }
}

我尝试了很多其他路线,但都没有奏效.我敢肯定有办法做到这一点,但它在逃避我.也许我盯着我的电脑太久了.

这是一个现场例子

http://ideone.com/tfopZ

更新资料

似乎在创建对象数组时除了传递引用外别无其他方法

$objects = array( &$object1, $object2 ); //object1 will be decorated, object2 will not
$thing->addObjects( $objects );

解决方法:

编辑:我能想到的另一种解决方案是将您的本地对象重新分配给数组元素,如下所示:

$dec->addObjects( $a);
$std = $a[0];
print_r( $std );

现在$std是对装饰对象的引用.

decorator Object
(
    [decoratee:protected] => stdClass Object
        (
        )

)

我还没有一个实际的解决方案,但是我认为我可以解释这种现象.

发生这种情况是因为默认情况下,对象引用是按值传递的.因此,在your example中,数组实际上包含对该对象的新引用:

$a = array( $std );

因此,您对该对象有两个引用:

>在初始化对象时创建的一个
>阵列拥有的一个.

它解释了为什么打印$std会为您提供与未装饰一样的对象,因为您正在查看的是在此处创建的$std,它与数组中包含的对象不同:

$std = new StdClass;

装饰器和测试对象正在与数组中的同一对象一起工作,这就是为什么从调用代码中转储$a会产生装饰对象的原因.

目前,我唯一想到的诱使PHP修改对象的方法是通过引用数组将其传递,如下所示:

$a = array( &$std );

当然,这可能是一个非常棘手的解决方案,可能无法满足您的需求.

标签:pass-by-reference,arrays,php,object
来源: https://codeday.me/bug/20191023/1915024.html