php构造函数和析构函数
php构造函数
php5允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象是先调用此方法,适合在使用对象之前做一些初始化的工作
注意:如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__cinstruct();
- 如果php5在类中找不到__construct()函数,它会尝试寻找旧式的构造函数,也就是和类名相同的函数,类似java的类方法。因此唯一会产生兼容性问题的情况是:类中已有名为__construct()的方法,但它却不是构造函数
- 当__construct()被父类__construct()具有不同参数的方法覆盖时,php不会产生一个E_STRICT的错误信息
- 构造函数没有参数,使用调用参数的构造函数不会抛出错误/警告
class A{ public function __construct(){ echo "hello"; } } $arg=1; $a=new A($arg);
打印结果:hello
/** 使用并调用多个构造函数 **/ class Myclass{ public function __construct(){ $a=func_get_args(); $i=func_num_args(); if(method_exists($this,$f='__construct'.$i)){//检查类方法是否存在 call_user_func_array(array($this,$f),$a);// 返回一个用户函数与特定的参数数组 } } function __construct1($a1){ echo('__construct with 1 param called: '.$a1.PHP_EOL); } function __construct2($a1,$a2){ echo('__construct with 2 params called: '.$a1.','.$a2.PHP_EOL); } function __construct3($a1,$a2,$a3){ echo('__construct with 3 params called:'.$a1.','.$a2.','.$a3.PHP_EOL); } } $a=new Myclass('aa');//__construct with 1 param called: aa $a=new Myclass('aa','bb');//__construct with 2 params called: aa,bb $a=new Myclass('aa','bb','cc');//__construct with 3 params called:aa,bb,cc
php析构函数
php5引入了析构函数的概念,析构函数会在到对象的所有的引用都被删除或者当对象被显示销毁时执行
注意:
和析构函数一样,父类的析构函数不会被引擎暗中调用,要执行父类的析构函数,必须在子类的析构函数体中显示调用parent::__destruct()
析构函数即使在使用exit()终止脚本运行时也会被调用,在析构函数中调用exit()将会中止其余关闭操作的运行
- 试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误
- 析构函数在脚本关闭时调用,此时所有的HTTP头信息已经发出。 脚本关闭时的工作目录有可能和在SAPI(如apache)中时不一样