PHP面向对象程序设计之构造方法和析构方法详解(2)
调用父类构造函数、调用无关类的构造函数:
function __construct(){ parent::__construct(); // 调用父类的构造函数必须显示的使用parent调用父类构造函数 classname::__construct(); // 调用其他类的构造函数,classname是类名 //其他操作 }
继承和构造函数
PHP中的子类的构造函数不会主动调用父类的构造函数,要显示的使用parent::__construct()
调用:
<?php class Animal{ private $name; function __construct($name){ $this->setName($name) echo "动物类被创建!"; } // ... 其他方法 } class Birds extends Animal{ private $name; private $leg; function __construct($name,$leg){ parent::__construct($name); // 显示调用 $this->setLeg($leg); echo "鸟类被创建!"; } // ... 其他方法 } ?>
如果涉及多层继承,当调用parent::__construct()
时,会沿着父类向上搜索,直到找到最合适的构造函数,例如:
// 接上例 class Parrot extends Birds{ private $name; private $leg; private $wing; function __construct($name){ parent::__construct($name); // 此时没有找到父类(Birds类)合适的构造函数,只能向上搜索,搜索到Animal类时,才找到合适的构造函数 echo "鹦鹉类被创建!"; $this->smackTalk(); /* 输出结果: "动物类被创建!" "鹦鹉说话!" */ } function smackTalk(){ echo "鹦鹉说话!"; } }
如果想要依次调用几个父类的构造函数,可以使用类名直接调用构造函数,例如:
function __construct($name,$leg){ Animal::__construct($name); // 调用Animal构造函数 Birds::__construct($name,$leg); // 调用Birds构造函数 }
2.析构函数
析构方法允许在销毁一个对象之前执行一些特定的操作,例如关闭文件,释放结果集等。
当堆内存段中的对象失去访问它的引用时,它就不能被访问了,也就成为垃圾对象了。通常对象的引用被赋予其他的值或者是在页面运行结束时,对象都会失去引用。
析构函数是在销毁对象时,自动调用的,不能显式的调用。析构函数不能带参数。
析构方法的声明格式如下:
function __deconstruct(){ //方法体,通常用来完成一些在对象销毁前的清理任务 }
在以下几种情况下可能会调用析构函数(但不一定):
- PHP页面加载完毕之后;
- unset()类;
- 变量引用指向别的对象或值时;
- PHP的内存回收机制和JAVA的很类似,对没有任何引用的对象进行销毁回收,采用引用计数器的技术。