本文共 901 字,大约阅读时间需要 3 分钟。
PHP中的构造函数和析构函数都属于魔术方法。构造函数在类被实例化时自动调用,而析构函数则在对象被销毁时自动调用,默认情况下是在程序结束时执行。这种特性在处理对象生命周期时非常有用。
在对象引用时,析构函数的调用行为会发生变化。如果只引用了一个对象(例如$obj),只要执行$obj = null;,则表示$obj被销毁,此时其析构函数会被提前调用。但其他未被销毁的对象不会受到影响。
需要注意的是,当使用$obj1 = &$obj;(即引用赋值)时,会产生共享内存空间的引用关系。当$obj或$obj1中的任何一个被销毁时,另一个也会随之消失。这种引用方式与直接赋值$obj1 = $obj;有显著区别。直接赋值会创建一个新的引用,当其中一个对象被销毁时,另一个仍然可用,直到最后两个对象同时被销毁时,析构函数才会被调用。
而使用$obj1 = clone $obj;则会创建两个独立的对象。$obj1和$obj互不影响,各自拥有独立的内存空间。为了更好地控制克隆行为,可以在类中定义__clone()魔术方法,赋予克隆后的对象特定属性或屏蔽不想要的值。例如:
class Player { public $name; function __destruct() { echo "Destroying " . $this->name; } function __clone() { $this->name = "gbcs"; }}$james = new Player();$james2 = clone $james;echo $james2->name . ' ';$james->name = "james";$james2->name = "james2";$james = null;echo $james2->name . ' '; 执行结果可以清晰地看到,克隆操作确实创建了两个独立的对象,并且__clone()魔术方法被调用。两个对象的销毁顺序也表明它们是独立的,与赋值行为有本质区别。
转载地址:http://rstfk.baihongyu.com/