面向对象 - 继承 ¶
作者:KK
发表日期:2017.2.16
快速了解 ¶
假设有A和B两个类,这两个类之间是可以发生继承关系的,而B继承A后,B会拥有A的大部分方法和属性
下面是基本的继承示例:
class A{
public $aa = 11;
public function test(){
echo 33;
}
}
class B extends A{
public $bb = 22;
public function run(){
echo 44;
}
}
$b = new B();
echo $b->aa; // 11
echo $b->bb; // 22
echo $b->test(); // 33
echo $b->run(); // 44
B继承A后,拥有了A的aa属性,所以$b->aa
的值就是11
顺便B也拥有了A的test方法,所以$b->test()
的值就是33
而关系上,A就是B的父类,B就是A的子类
重写 ¶
继承类可以重新定义父类相同的属性或方法:
class A{
public $aa = 11;
public function test(){
echo 'aaa';
}
}
class B extends A{
public $aa = 22;
public function test(){
echo 'bbb';
}
}
$b = new B();
echo $b->aa; // 22
echo $b->test(); // bbb
B类重新声明了与A类里面相同的aa属性,所以以B的声明默认值为准,输出了22;重写test方法的道理也是一样
多重继承 ¶
B继承A,则A有了一个子类了,就像人类可以有儿子一样;其实甚至还能有孙子!
B继承A,让C继承B的话,那A就有孙子了,B也有儿子了!
class A{
public $aa = 11;
public function test(){
echo 'aaa';
}
}
class B extends A{
public function xxx(){
echo 'bbb';
}
}
class C extends B{}
$c = new C();
echo $c->aa; // 11
echo $c->test(); // aaa
echo $c->xxx(); // bbb
C没有重写父类的任何东西,但同时拥有A和B两个父类的“财产”,所以说继承真是个黑科技啊!
而且还能定义D继承C,定义E继承D……无限地延续后代!
此时我们可以说A和B是C的父类,如果D又继承了C的话,也有一种说法是A、B和C是D的祖父类……我想一般人都能理解吧
调用父类的方法 ¶
class A{
public function age(){
return 11;
}
}
class B extends A{
public function age(){
return 22;
}
public function test1(){
echo $this->age();
}
public function test2(){
echo parent::age(); //重点 parent
}
}
$b = new B();
$b->test1(); //22
$b->test2(); //11
test1调用了自己的age方法,因为是重写的age所以返回了22
test2通过parent关键字声明是要调用父类的age方法,所以就返回了11,注意书写语法是parent::方法名()
这并不是全部 ¶
关于继承的知识点,后面把作用域也学一下再说说“继承财产的分配问题”……