析构函数和垃圾回收机制

析构函数(__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 '有对象创建了','
'; } public function __destruct() { echo '有对象销毁了'; } } $p1 = new Person(); echo xdebug_debug_zval('p1'); //unset($p1); //手动销毁 //$p1 = 12; //赋值可以是任何类型的值 echo '
'; /* 有对象创建了 p1: (refcount=1, is_ref=0) object(Person)[1] -------------------------------- 有对象销毁了 有对象创建了 p1: (refcount=1, is_ref=0) object(Person)[1] 有对象销毁了 -------------------------------- */
class Person
{
    public function __construct()
    {
        echo '有对象创建了','
'; } 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 '
'; /* * 有对象创建了 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 '有对象创建了','
'; } 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 '
'; /* 有对象创建了 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< -------------------------------------------- 有对象销毁了 */

你可能感兴趣的:(析构函数和垃圾回收机制)