如果子类未定义构造函数,则将直接继承父类构造函数;如果子类有构造函数,除非显式调用父类构造函数,否则父类构造函数不用理会(可理解为重写)
<?php
header('content-type:text/html;charset=utf-8');
class Father{
public function __construct(){
echo '父类构造函数已执行<br>';
$this->_init();
}
protected function _init(){
echo '父类_init方法已执行<br>';
}
}
class Son extends Father{
protected $lesson;
public function _init($lesson='$lesson为_init方法设定值'){
echo '子类_init方法已执行<br>';
$this->lesson = $lesson;
}
public function demo(){
echo '子类demo方法已执行<br>';
$this->_init('$lesson为demo方法设定值');
echo $this->lesson;
}
public function demo2(){
echo '子类demo2方法已执行<br>';
echo $this->lesson;
}
}
demo方法执行顺序如下:1.子类构造方法(从父类继承)2.子类_init方法(重写父类_init方法)3.子类demo方法 4.子类_init方法(重写父类_init方法)
$obj = new Son();
//输出:
//父类构造函数已执行
//子类_init方法已执行
$obj->demo();
//输出:
//子类demo方法已执行
//子类_init方法已执行
//$lesson为demo方法设定值
demo2方法执行顺序如下:1.子类构造方法(从父类继承)2.子类_init方法(重写父类_init方法)3.子类demo2方法
$obj = new Son();
//输出:
//父类构造函数已执行
//子类_init方法已执行
$obj->demo2();
//输出:
//子类demo2方法已执行
//$lesson为_init方法设定值
PHP继承相当于把父类所有非private声明的方法、变量照搬一份到子类中;重写则是当照搬后有相同名字的方法或变量时,已子类的为准,父类无效