gpt4 book ai didi

php - 玩引用

转载 作者:IT王子 更新时间:2023-10-29 00:04:03 26 4
gpt4 key购买 nike

我明白为什么

$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;
$c['ID'] = 37;
echo $a['ID']."\n";
echo $b."\n";
echo $c['ID']."\n";

输出 37、42、37

同时

$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;
$b = 37;
echo $a['ID']."\n";
echo $b."\n";
echo $c['ID']."\n";

输出 37、37、37

在这两种情况下,$b 都是对 $a['ID'] 的引用,而 $c 是指向同一对象的指针作为 $a.

$b 改变 $a['ID']$c['ID'] 改变因为分配 $ b 更改 $a['ID'] 引用的值。

$c['ID']改变时,一个新的int被分配给$a['ID']$b不再引用 $a['ID']

但这让我很痒

$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;
$c['ID'] &= 0;
$c['ID'] |= 37;
echo $a['ID']."\n";
echo $b."\n";
echo $c['ID']."\n";

(输出 37、37、37)

这是定义的行为吗?我在文档中没有看到任何相关内容...

最佳答案

让我们以此代码为基础:( refcounting documentation )

$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;

xdebug_debug_zval('a');
xdebug_debug_zval('b');
xdebug_debug_zval('c');

这给出:

a:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=2, is_ref=1),int 42
b:
(refcount=2, is_ref=1),int 42
c:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=2, is_ref=1),int 42

如你所说:$a 是一个对象,$b$a['ID'] 的引用( $a['ID' ]$b :refcount=2, is_ref=1)和 $c is copy as a reference (since PHP5) , 所以 $c 是 $a 的引用(它现在是同一个对象:refcount=2, is_ref=0)


如果我们这样做:$c['ID'] = 37;

我们得到:

a:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=1, is_ref=0),int 37
b:
(refcount=1, is_ref=0),int 42
c:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=1, is_ref=0),int 37

$c['ID'] 被分配了一个新的 int 所以 =>

$b 变得独立(refcount=1is_ref=0),以及 $a['ID' ]$c['ID']

但是因为 $c$a 是依赖的,$a['ID']$c['ID ']取相同的值37。


现在,让我们获取基本代码,我们这样做:$c['ID'] &= 0;

更新:出乎意料的是,我们得到:

a:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=2, is_ref=1),int 0
b:
(refcount=2, is_ref=1),int 0
c:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=2, is_ref=1),int 0

而不是:( if: $c['ID'] = $c['ID'] & 0;)

a:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=1, is_ref=0),int 0
b:
(refcount=1, is_ref=0),int 42
c:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=1, is_ref=0),int 0

ArrayObject 实现 ArrayAccess 因此:

正如评论中所述documented here :

直接修改是完全替换数组维度的值,如 $obj[6] = 7。另一方面,间接修改仅更改部分维度,或尝试通过引用将维度分配给另一个变量,如 $obj[6][7] = 7 或 $var =& $obj[6]。用++ 递增和用 -- 递减也以需要间接修改的方式实现。

可能的答案:

“组合运算符(+=、-=、&=、|=)可以以相同的方式工作(间接修饰。)”:

refcount and is_ref are not impacted therefore (in our case) the values of all related variables are modified. ($c['ID'] => $a['ID'] => $b)

关于php - 玩引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16659976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com