用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2936|回复: 1
收起左侧

[初级] PHP类构造函数继承性问题

[复制链接]
发表于 2016-12-31 12:25:40 | 显示全部楼层 |阅读模式
本帖最后由 keweisen 于 2016-12-31 12:25 编辑

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

PHP复制代码
private function __construct() {
 
}
复制代码

当设置为private时,该类不可以被继承(不可以被扩展)。构造函数的私有性在单例模式中得到了充分的应用,这个会在接下来的文章中提到。

当子类自身有构造函数时,子类不会继承父类的构造函数,若想继承,则需要在子类中定义:

PHP复制代码
public function __construct() {
 
   parent::__construct();
 
}
复制代码

此处举一个我在学CI框架时遇到的一个问题,我定义了一个Test类,并在Test的构造函数中 加载了 来自父类的方法 $this->load->helper(‘url’);于是就报错了。

Message: Undefined property: Test::$load

Fatal error: Call to a member function helper() on null inD:\XAMP\htdocs\CI\application\controllers\Test.php on line 4


原因是定义了子类的构造函数,则不会继承父类的构造函数,正确的写法应该如下,

PHP复制代码
class Test extends CI_Controller {
 public function __construct() {
    parent::__construct();//继承父类的构造函数
    $this->load->helper('url');
 }
 public function hello() {
    echo site_url('Test/hello');
 }
}
复制代码

若子类自身没有构造函数,则会自动调用父类的构造函数,

PHP复制代码
class Pet {
 
 function __construct($pet_name) {
   echo $pet_name;
 }
}
class Cat extends Pet {
}
 
$ca = new Pet('K');//输出K
$cat = new Cat('Ke阿猫');//输出Ke阿猫
复制代码

总结,在PHP中,当子类集成了父类,若子类没有构造函数,则继承父类的构造函数,若子类有自身的构造函数,则不继承,若需继承,则需在自身构造函数内引用

PHP复制代码
parent::__construct();
复制代码
欢迎补充和讨论。


【转自】Ke阿猫

本版积分规则