PHP通过同名重新实例化类

时间:2014-06-23 10:34:51

标签: php singleton

这实际上是一个简单的问题,但我在这里找不到简明的答案。

假设我实例化一个类:

$hedgehog = new Hedgehog();

然后再使用相同的变量名实例化它:

$hedgehog = new Hedgehog();

这只会破坏前一个实例吗?或者,如果我想破坏之前的实例,是否有更好的方法来解决这个问题?感谢

1 个答案:

答案 0 :(得分:0)

删除未使用的标量,数组和对象的过程称为垃圾回收

PHP的GC基于参考计数器。只要没有对 zval (内部结构存储变量)的引用,垃圾收集器就可以删除

引用计数和垃圾收集的一个很好的介绍位于here

如果你这样做,这个基本的理解很重要。创建对同一 zval 的另一个引用(在本例中为您的对象):

$myHedgehog = new Hedgehog();
$yourHedgehog = $myHedgehog;
$myHedgehog = new Hedgehog();

在这种情况下,旧的 Hedgehog对象将保留,$yourHadgehog仍将指向它。

即使对象引用自身也会更加混乱:

$myHedgehog = new Hedgehog();
$myHedgehog->father = $myHedgehog;
unset($myHedgehog);

在这种情况下,您将无法访问Hedgehog对象,因为没有更多的符号指向它,但由于仍有对它的引用,垃圾收集器不会删除它。
这也适用于具有对自身作为成员的引用的数组:

$myArray = array();
$myArray['somekey'] =& $myArray;
unset($myArray);

请注意&运算符将存储对$myArray的引用,而不是复制数组。