keweisen 发表于 2016-12-31 12:25:40

PHP类构造函数继承性问题

本帖最后由 keweisen 于 2016-12-31 12:25 编辑

PHP类的构造函数格式为__construct(){},(比较旧的PHP版本中构造函数与类函数同名)默认为可继承,当然也可以设置为private私有的,即private function __construct() {

}当设置为private时,该类不可以被继承(不可以被扩展)。构造函数的私有性在单例模式中得到了充分的应用,这个会在接下来的文章中提到。当子类自身有构造函数时,子类不会继承父类的构造函数,若想继承,则需要在子类中定义:public function __construct() {

   parent::__construct();

}此处举一个我在学CI框架时遇到的一个问题,我定义了一个Test类,并在Test的构造函数中 加载了 来自父类的方法 $this->load->helper(‘url’);于是就报错了。Message: Undefined property: Test::$loadFatal error: Call to a member function helper() on null inD:\XAMP\htdocs\CI\application\controllers\Test.php on line 4
原因是定义了子类的构造函数,则不会继承父类的构造函数,正确的写法应该如下,class Test extends CI_Controller {
public function __construct() {
    parent::__construct();//继承父类的构造函数
    $this->load->helper('url');
}
public function hello() {
    echo site_url('Test/hello');
}
}若子类自身没有构造函数,则会自动调用父类的构造函数,class Pet {

function __construct($pet_name) {
   echo $pet_name;
}
}
class Cat extends Pet {
}

$ca = new Pet('K');//输出K
$cat = new Cat('Ke阿猫');//输出Ke阿猫
总结,在PHP中,当子类集成了父类,若子类没有构造函数,则继承父类的构造函数,若子类有自身的构造函数,则不继承,若需继承,则需在自身构造函数内引用parent::__construct();欢迎补充和讨论。


【转自】Ke阿猫

Hex 发表于 2016-12-31 23:13:12

好文,支持~
页: [1]
查看完整版本: PHP类构造函数继承性问题