析构函数和垃圾回收机制

析构函数(__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<
--------------------------------------------
有对象销毁了
*/
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容