php-通过引用方法传递对象数组
作者:互联网
我的课堂上有一个方法可以通过引用接受对象.它装饰该对象以扩展功能.
基本上…
public function addObject( &$object ) {
$object = $this->decorate( $object );
}
我正在尝试编写一个方便的方法addObjects(),但它没有更改$object
这行不通…
public function addObjects( array &$objects ) {
foreach( $objects as $object ) {
$this->addObject( $object );
}
}
我尝试了很多其他路线,但都没有奏效.我敢肯定有办法做到这一点,但它在逃避我.也许我盯着我的电脑太久了.
这是一个现场例子
更新资料
似乎在创建对象数组时除了传递引用外别无其他方法
$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