继承
继承是以一个类为父类,另一个类作为它的子类,子类在继承了父类的属性和方法的基础上,还可以进一步的拓展,例如增加或修改属性或方法
- 语法:在子类声明的地方加入
extends [父类名]
,也就是[Zilei] extends [父类名]
; - 当前子类,就拥有了父类的属性和方法,除了private属性方法除外,权限修饰符的作用再一次体现,仅在当前类中可被访问;
- 一个类只能继承一个父类,不能是多个类;
示例:
class Ren{
private $height = 160;
public function ku(){
echo '学生哭了555555555<br/>';
}
}
class Xuesheng extends Ren{
public function xiao(){
echo '学生笑了<br/>';
}
}
$a = new Xuesheng();
$b = new Ren();
$a->ku();
$a->xiao();
$b->ku();
$b->xiao();//xiao not found!
关于private继承的问题
- 说法一:private属性或方法不能被继承,可以通过一些特别的写法,达到读写父类私有属性得目的,但是他还是不能被继承;
- 说法二:private属性或方法可以被继承,但是不可访问,可以通过一些特别的写法,达到读写目的;
- 最终结论:不管哪一种说法,反正private属性是不能在子类中直接愉快的使用的,记住这一点就OK了;
三个属性修饰,那些会被继承
-
public
,protected
,private
-
public
,protected
可以被直接继承,并拥有读写权限; -
private
不能被直接继承,无法进行读写; -
证明:
private
属性和方法会被继承:
class Ren {
private $name = '小甜甜';
}
class Stu extends Ren{
private $name = '鸡爪';
}
$lilei = new Stu();
print_r($lilei);//Stu Object ( [name:Stu:private] => 鸡爪 [name:Ren:private] => 小甜甜 )
-
证明了父类的私有属性,确实会被继承
-
最终一个子类继承的结构是这样的:
class A {
public $name = null;
private $money = null;
}
class B extends A{
public $income = null;
private $weight = 76;
}
$张三 = new B();
//张三最终的结构:
张三:{
A:{
private $money属性,
B:{
private $weight属性,
public $name属性,
public $income属性
}
}
}
继承了那些东西?
- 继承了父类的public/protected属性和方法,完全继承,属于子类,可读可写;
- 继承了父类的private属性和方法,但不可读不可写;
子类可以做什么扩充?
- 属性/方法,可以修改或增加
- 同名属性,方法,可以直接被重写
- 子类继承了父类的属性和方法之后,想要重写属性,那么权限修饰符只能越来越宽松或相等,不能更严格;
构造函数如何继承的?
- 首先父类的构造函数是会被继承的。
- 继承父类的构造函数时,如果父类的某些方法依赖于父类的构造函数执行后返回的结果作为参数,那么为了确保继承过来的父类的方法正常运行,应该在子类重写父类构造函数时,先执行一下父类的构造函数:
parent::__construct()
,parent
不能调用父类的private
权限的方法; - 与其他语言中不同点是:在Java中,实例化子类时,父类的构造函数会运行,而且会先于子类的构造函数运行,然后才是子类的构造函数运行;
- 在PHP中,如果子类没有写构造函数,则直接使用父类构造函数,如果子类写了构造函数,则运行子类构造函数,父类构造函数不会运行,子类中可以手动调用父类的构造函数;
权限修饰符总结
public
,protected
,private
范围 | public | protected | private |
---|---|---|---|
类内 | 可以访问 | 可以访问 | 可以访问 |
类外 | 可以访问 | 不可访问 | 不可访问 |
子类 | 可以访问 | 可以访问 | 不可访问 |