Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:继承就是为了代码复用,类似的还有trait
序号 | 名称 | 关键字 | 类外部 | 类内部 | 类继承上下文 | 描述 |
---|---|---|---|---|---|---|
1 | 公开成员 | public |
允许 | 允许 | 允许 | 默认 |
2 | 受保护成员 | protected |
禁止 | 允许 | 允许 | 封装 |
3 | 私有成员 | private |
禁止 | 允许 | 禁止 | 封装 |
继承示例
<?php
class A{
public $a=1;
protected $b=2;
protected $c=3;
public function get(){
return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
}
}
class B extends A{
}
$b=new B;
echo $b->get();
//结果为
//a=1,b=2, c=3
<?php
class A{
public $a=1;
protected $b=2;
//将c改为私有属性
private $c=3;
}
class B extends A{
//尝试在子类访问私有属性
public function get(){
return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
}
}
$b=new B;
echo $b->get();
//结果为
//a=1,b=2, c=0
//子类不能调用继承自父类的私有属性
重写演示
<?php
class A{
public $a=1;
protected $b=2;
protected $c=3;
public function get(){
return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
}
}
class B extends A{
//重写父类中的属性
public $a=100;
//重写父类的方法
public function get(){
return sprintf('子类中a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
}
}
$b=new B;
echo $b->get();
//结果为
//子类中a=100,b=2, c=3
扩展演示
<?php
class A{
public $a=1;
protected $b=2;
protected $c=3;
public function get(){
return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
}
}
class B extends A{
// 属性扩展
public $d=4;
//方法重写
public function get(){
return parent::get().sprintf('c=%d',$this->d);
}
//方法扩展
public function add(){
return 'a+b+c+d='.($this->a+$this->b+$this->c+$this->d);
}
}
$b=new B;
echo $b->get(),'<br>';
echo $b->add();
//结果为
//a=1,b=2, c=3c=4
//a+b+c+d=10
抽象类不能被实例化
任何类里含有抽象方法都必须声明为抽象类
抽象类只能在实现了抽象方法之后才能被实例化
抽象类部分分离了设计与现实
<?php
abstract class Stu{
public $name;
public $school='实验小学';
const NATION ='中国' ;
public function out(){
return "{$this->name}来自{$this->school}";
}
abstract public function from();
}
class Stu1 extends Stu{
public $name='小明';
public function from(){
return $this->name.'出生于'.Stu::NATION;
}
}
$stu=new Stu1;
echo $stu->out(),'<br>';
echo $stu->from();
//结果
// 小明来自实验小学
// 小明出生于中国
接口实现了设计与分离
接口内只能包含常量和方法的定义
接口中定义的所有方法都必须是公有
可以用接口实现多继承
接口使用 implements 实现
接口演示
<?php
interface Stu1{
const NAME='小明';
public function from();
}
interface Stu2{
public function out();
}
class Stu implements Stu1,Stu2{
public $school='实验小学';
const NATION ='中国' ;
public function out(){
return Stu1::NAME."来自{$this->school}";
}
public function from(){
return Stu1::NAME.'出生于'.self::NATION;
}
}
$stu=new Stu;
echo $stu->out(),'<br>';
echo $stu->from();
//运行结果
// 小明来自实验小学
// 小明出生于中国
总结:总的来说继承是一种减少代码冗余的手段,抽象类和接口类都是为了实现将设计与实现分离,其中接口类实现了 php 的多继承