msgbartop
PHP源码分析,Zend引擎分析,Web相关技术研究,Web技术分享–左手代码 右手诗
msgbarbottom

04 Sep 08 PHP4中模拟类的析构函数

最近做的一个项目是基于PHP4的, 习惯了PHP5的面对对象,面对PHP4,难免会有很多不爽:

不支持public, static, private, protected关键字, 最郁闷的是,不支持析构函数:

本文就将借助PHP的register_shutdown_function来在PHP4中模拟类的析构函数

我们在构造函数中, 注册析构函数:

class sample{
   var $identified;
   function sample($iden){
       $this->identified = $iden;
      register_shutdown_function(array(&$this, '__destructor')); //模拟析构函数
    }
   function __destructor(){
     error_log("destructor executing, Iden is ". $this->identified);
     unset($this);
   }
}

 $sample = new sample("laruence");
 $sample2 = new sample("HuiXinchen");

执行这个脚本, 你会发现, 对象的析构函数被正确的调用了. ;)
因为我们在注册关闭函数的时候,使用了$this关键字, 所以,即使你的对面变量被覆盖了, 析构函数也是可以被正确调用的,比如:

class sample{
   var $identified;
   function sample($iden){
       $this->identified = $iden;
      register_shutdown_function(array(&$this, '__destructor')); //模拟析构函数
    }
   function __destructor(){
     error_log("destructor executing, Iden is ". $this->identified);
     unset($this);
   }
}

 $sample = new sample("laruence");

 $sample = "laruence"; //覆盖对象变量

$sample被覆盖,但是运行这段脚本,你会发现析构函数还是可以被正确调用. 即使是下面的代码:

class sample{
   var $identified;
   function sample($iden){
       $this->identified = $iden;
      register_shutdown_function(array(&$this, '__destructor')); //模拟析构函数
    }
   function __destructor(){
     error_log("destructor executing, Iden is ". $this->identified);
     unset($this);
   }
}

 $sample = new sample("laruence");
 unset($sample);

析构函数还是可以被正确调用.

Related Posts:

  • No Related Post

Reader's Comments

  1. |

    顶Hack的做法!

  2. |

    PEAR和这个作法是一样的.

Leave a Comment

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word