面向对象,子类的构造函数与析构函数
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();

浙公网安备 33010602011771号