面向对象,子类的构造函数与析构函数
class animal { public $head; private $height; protected $width; public function __construct($height,$width)//属性和成员函数默认是public形式,所以public可以不用写 { $this->height=$height; $this->width=$width; echo '<br>我是animal类构造函数的输出<br>'; } public function move() { echo '<br>我是move方法的执行结果!<br>'; } function introduce() { echo '<br>我的高度是:'.$this->height; echo '<br>我的宽度是:'.$this->width; } function __destruct() { echo 'animal类现在对象以及运行完,开始销毁了!'; } } class person extends animal { function __construct() { echo '这是person类的构造方法<br />'; } function __destruct() { echo '这是person类析构方法<br />'; } } $person_obj=new person();
上面的代码中,只要子类定义了构造函数和析构函数,就不会执行父类的构造函数与析构函数,子类可以定义构造函数和析构函数的参数可以和父类不一样;
class person extends animal { } //$person_obj=new person();此代码错误,因为父类的构造函数有2个参数,所以在类实例化为对象时需要对应带两个参数;
$person_obj=new person('170','36');
上面的代码中,由于没有定义构造函数和析构函数,所以会自动调用父类的构造函数和析构函数;
class person extends animal { function __construct($x) { parent::__construct('36','29'); echo "<br />$x<br />"; } function __destruct() { parent::__destruct(); echo 'person类运行完毕'; } } $person_obj=new person('3'); $person_obj->introduce();
上面的代码中,如果调用父类的构造函数和析构函数,需要parent::__construct('130','41');,parent::destruct();如果调用父类的构造函数,参数必须和父类的对应一致
一共总结如下几点:
一:子类如果不定义构造函数和析构函数时,会自动调用父类的构造函数和析构函数;在类初始化实例对象时,参数要与父类的构造函数一致;
二:子类可以定义构造函数和析构函数,子类的构造函数的参数可以和父类不一样;只要子类定义了构造函数和析构函数,那么父类的构造函数和析构函数就没有执行的机会,就不会调用;
三:如果子类想调用父类的构造函数和析构函数,可以在构造函数和析构函数里面parent::__construct('130','41');,parent::destruct();参数必须和父类的对应一致,此时父类的构造函数和析构函数的地位就像普通的public函数一样,不会自动执行;子类的任何一个成员函数都可以调用,包含子类的析构函数和构造函数,例如下面的代码;
class person extends animal { function __construct($x) { parent::__construct('36','29'); echo "<br />$x<br />"; } function __destruct() { parent::__destruct(); echo '<br />person类运行完毕'; } function test() { parent::__construct('36','29'); } } $person_obj=new person('3'); $person_obj->introduce(); $person_obj->test();