构造方法和析构方法是一种特殊的方法。构造方法,类被实例化时调用,用来给成员属性赋初值,做一些准备工作;析构方法(无参数),在类的实例脱
离其作用域被销毁时调用(自动调用),做一些诸如释放内存等善后工作。
构造方法的语法格式为;
function __construct(){
//方法实现细节
}
因为构造方法是在类被实例化时调用的,因此并不是由实例化的类名加操作符->的形式调用,而是按照如下的语法格式调用:
变量名 = new 类名([构造方法的参数])
注意:如果类中没有构造方法,PHP引擎会自动添加一个构造方法,其参数列表为空,方法内容为空
析构方法在类的实例被销毁时自动调用,且无方法参数,格式如下;
function __destruct(){
//方法实现细节
}
注意:如果类中没有定义析构函数,PHP引擎会自动添加一个析构方法,其方法内容为空
两者结合用法如下;
<?php
class Cat{
function __construct(){
echo '一个绝世的猫诞生了';
}
function __destruct(){
echo '来也匆匆,去也匆匆';
}
}
$c = new Cat();//实例化类,调用无参数的构造方法
//$c被销毁时自动调用析构方法
?>
运行结果如下:
一个绝世的猫诞生了
来也匆匆,去也匆匆
关于构造方法和析构方法,这里还有几点补充说明:
<1>如果子类中没有定义构造方法,则子类在实例化时会默认去 调用父类的构造方法。对于析构方法同样如此,如果子类中没有定义析构方法,则子类的实
例被销毁时会默认调用父类的析构方法
<2>如果子类中定义了构造方法,则子类在实例化不会自动去调用父类的构造方法。对于析构方法同样如此,如果子类中定义了析构方法,则子类的实例化被
销毁的时候不会自动去调用父类的析构方法。
为了在子类中调用父类的构造方法和析构方法,必须按如下语法格式显示调用;
(1)显示调用父类的构造方法
function __construct([子类的构造方法的参数]){ //定义子类的构造方法
…………
parent::__construct([父类的构造方法的参数]); //显示调用父类的构造方法
…………
}
(2)显示调用父类的析构方法
function __destruct(){ //定义子类的析构方法
…………
parent::__destruct([父类的构造方法的参数]); //显示调用父类的析构方法
…………
}
用法如下所示:
/**
* 父类
*/
class Parent{
public $name; //共有属性
private $age; //私有属性
function __construct($name,$age){ //父类的构造方法
$this->name = $name;
$this->age = $age;
}
public function introduceMyself(){ //共有方法
echo '本府'.$this->name.'年方'.$this->age;
}
function __destruct(){ //父类的析构方法
echo “来也匆匆,去也匆匆”;
}
}
/**
* 子类
*/
class Student extends Parent{
public $school; //共有属性
function __construct($name,$age,$school){ //父类的构造方法
parent::__construct($name,$age); //显示调用父类的构造方法
$this->school= $school;
}
public function getSchool(){ //共有方法
echo '俺来自大名鼎鼎的'.$this->school;
}
function __destruct(){ //子类的析构方法
echo “终于可以不用上学了”;
parent::__destruct(); //显示的调用父类的析构方法
}
}
$s = new Student('默默',19,'城管小学'); //实例化子类,调用子类的构造方法
echo ‘本府行不改名坐不改姓,’.$s->name.'是也'; //调用继承自父类的属性
$s->introduceMyself(); //调用继承自父类的方法
$s->getSchool(); //调用子类方法
//$s被销毁,调用子类的析构方法
运行结果如下:
本府行不改名坐不改姓,默默是也
本府默默,年方19
俺来自大名鼎鼎的城管小学
终于可以不用上学了来也匆匆,去也匆匆