有没有办法访问给定对象的所有引用?

6

有没有人知道如何销毁/更改在许多地方引用的PHP对象?显然,unset只能销毁一个引用,有时手动跟踪所有引用不是一个选项。有什么想法吗?也许在Reflection中我漏掉了什么?

2个回答

6
不可以,但是你可以使用额外的间接层来代替。目前你的代码如下所示:
 a    b     c           a    b    (unset)
  \   |    /             \   |
   \  |   /    -->        \  |
    object                 object

你可以这样做:

 a    b     c           a    b     c
  \   |    /             \   |    /
   \  |   /    -->        \  |   /
   wrapper                (unset)
      |
      |
   object

3
很好的回答,马克,但我不确定这会怎么样:
第一张图:
<?php

$obj = "foo";
$a = $obj;
$b = $obj;
$c = $obj;

$c = NULL;
unset( $c );
var_dump( $a, $b, $c );

结果:

string(3) "foo"
string(3) "foo"
NULL

第二张图:

<?php

$obj = "foo";
$wrapper =& $obj;
$a = $wrapper;
$b = $wrapper;
$c = $wrapper;

$c = NULL;
unset( $c );
var_dump( $a, $b, $c );

结果:

string(3) "foo"
string(3) "foo"
NULL

正确的方式:

<?php

$obj = "foo";
$a =& $obj;
$b =& $obj;
$c =& $obj;

$c = NULL;
var_dump( $a, $b, $c );

结果:

NULL
NULL
NULL

说明:

你需要引用变量 $a,$b,$c 到 $obj 的内存地址,这样当你将 $c 设置为 NULL 时,这将会将实际的内存地址设置为 NULL,而不仅仅是引用。


尽管在实际操作中,当设置对象的引用时,并不总是更容易使用引用来设置它。 - andho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接