析构函数(__destruct()):当某个对象的所有引用都被删除(成为垃圾)或者当对象被显示销毁时执行,析构函数不能带参数
在php中,没有任何变量指向这个对象时,这个对象就成为垃圾,php会将其在内存中销毁。这是php的GC(Garbage Collector)垃圾处理机制,目的是防止内存溢出
php中的变量在内存中存在于一个zval的变量容器中,机构如下:
变量类型
变量值
is_ref 是bool值,用来区分变量是否属于引用集合,表示变量是否有一个以上的别名
refcount 引用计数器,表示指向这个zval变量容器的变量个数,
当refcount值为1时,is_ref的值为false。因为当refcount为1时,此变量不可能有多个别名,也就不存在引用了。
当refcount为0时,zval已成为垃圾可回收
class Person
{
public function __construct()
{
echo '有对象创建了','<br>';
}
public function __destruct()
{
echo '有对象销毁了';
}
}
$p1 = new Person();
echo xdebug_debug_zval('p1');
//unset($p1); //手动销毁
//$p1 = 12; //赋值可以是任何类型的值
echo '<hr>';
/*
有对象创建了
p1:
(refcount=1, is_ref=0)
object(Person)[1]
--------------------------------
有对象销毁了
有对象创建了
p1:
(refcount=1, is_ref=0)
object(Person)[1]
有对象销毁了
--------------------------------
*/
class Person
{
public function __construct()
{
echo '有对象创建了','<br>';
}
public function __destruct()
{
echo '有对象销毁了';
}
}
$p1 = new Person();
echo xdebug_debug_zval('p1');
$p2 = $p1;
echo xdebug_debug_zval('p1');
unset($p1);
echo xdebug_debug_zval('p2');
$p2 = true;
echo '<hr>';
/*
*
有对象创建了
p1:
(refcount=1, is_ref=0)
object(Person)[1]
p1:
(refcount=2, is_ref=0)
object(Person)[1]
p2:
(refcount=1, is_ref=0)
object(Person)[1]
有对象销毁了
---------------------------------------
*/
class Person
{
public function __construct()
{
echo '有对象创建了','<br>';
}
public function __destruct()
{
echo '有对象销毁了';
}
}
/*$p1 = new Person();
$p2 = new Person();
$p3 = new Person();
$p1 = $p2 = $p3 = new Person();*/
/*
有对象创建了
有对象创建了
有对象销毁了有对象创建了
有对象销毁了有对象创建了
有对象销毁了有对象销毁了
*/
$p1[] = new Person();
$p1[] = &$p1;
echo xdebug_debug_zval('p1');
unset($p1);
echo '<hr>';
/*
有对象创建了
p1:
(refcount=2, is_ref=1) 如果是引用赋值,is_ref=1,否则为0
array (size=2)
0 => (refcount=1, is_ref=0)
object(Person)[1]
1 => (refcount=2, is_ref=1)
&array<
--------------------------------------------
有对象销毁了
*/