批改状态:合格
老师批语:继承就是为了代码复用,类似的还有trait
| 序号 | 名称 | 关键字 | 类外部 | 类内部 | 类继承上下文 | 描述 |
|---|---|---|---|---|---|---|
| 1 | 公开成员 | public |
允许 | 允许 | 允许 | 默认 |
| 2 | 受保护成员 | protected |
禁止 | 允许 | 允许 | 封装 |
| 3 | 私有成员 | private |
禁止 | 允许 | 禁止 | 封装 |
继承示例
<?phpclass 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
<?phpclass 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//子类不能调用继承自父类的私有属性
重写演示
<?phpclass 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
扩展演示
<?phpclass 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
抽象类不能被实例化
任何类里含有抽象方法都必须声明为抽象类
抽象类只能在实现了抽象方法之后才能被实例化
抽象类部分分离了设计与现实
<?phpabstract 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 实现
接口演示
<?phpinterface 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 的多继承
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号