面向对象 - 继承

  • 作者: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::方法名()


这并不是全部

关于继承的知识点,后面把作用域也学一下再说说“继承财产的分配问题”……