博客列表 >类的继承、抽象类、接口

类的继承、抽象类、接口

小程_武汉_214945
小程_武汉_214945原创
2020年05月14日 21:54:25747浏览

访问权限

序号 名称 关键字 类外部 类内部 类继承上下文 描述
1 公开成员 public 允许 允许 允许 默认
2 受保护成员 protected 禁止 允许 允许 封装
3 私有成员 private 禁止 允许 禁止 封装

继承的三大功能

  • 继承:继承基类的成员
  • 重写:覆写基类中的成员
  • 扩展:子类中添加新的方法

继承示例

  1. <?php
  2. class A{
  3. public $a=1;
  4. protected $b=2;
  5. protected $c=3;
  6. public function get(){
  7. return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  8. }
  9. }
  10. class B extends A{
  11. }
  12. $b=new B;
  13. echo $b->get();
  14. //结果为
  15. //a=1,b=2, c=3
  1. <?php
  2. class A{
  3. public $a=1;
  4. protected $b=2;
  5. //将c改为私有属性
  6. private $c=3;
  7. }
  8. class B extends A{
  9. //尝试在子类访问私有属性
  10. public function get(){
  11. return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  12. }
  13. }
  14. $b=new B;
  15. echo $b->get();
  16. //结果为
  17. //a=1,b=2, c=0
  18. //子类不能调用继承自父类的私有属性

重写演示

  1. <?php
  2. class A{
  3. public $a=1;
  4. protected $b=2;
  5. protected $c=3;
  6. public function get(){
  7. return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  8. }
  9. }
  10. class B extends A{
  11. //重写父类中的属性
  12. public $a=100;
  13. //重写父类的方法
  14. public function get(){
  15. return sprintf('子类中a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  16. }
  17. }
  18. $b=new B;
  19. echo $b->get();
  20. //结果为
  21. //子类中a=100,b=2, c=3

扩展演示

  1. <?php
  2. class A{
  3. public $a=1;
  4. protected $b=2;
  5. protected $c=3;
  6. public function get(){
  7. return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  8. }
  9. }
  10. class B extends A{
  11. // 属性扩展
  12. public $d=4;
  13. //方法重写
  14. public function get(){
  15. return parent::get().sprintf('c=%d',$this->d);
  16. }
  17. //方法扩展
  18. public function add(){
  19. return 'a+b+c+d='.($this->a+$this->b+$this->c+$this->d);
  20. }
  21. }
  22. $b=new B;
  23. echo $b->get(),'<br>';
  24. echo $b->add();
  25. //结果为
  26. //a=1,b=2, c=3c=4
  27. //a+b+c+d=10

抽象类

  • 抽象类不能被实例化

  • 任何类里含有抽象方法都必须声明为抽象类

  • 抽象类只能在实现了抽象方法之后才能被实例化

  • 抽象类部分分离了设计与现实

  1. <?php
  2. abstract class Stu{
  3. public $name;
  4. public $school='实验小学';
  5. const NATION ='中国' ;
  6. public function out(){
  7. return "{$this->name}来自{$this->school}";
  8. }
  9. abstract public function from();
  10. }
  11. class Stu1 extends Stu{
  12. public $name='小明';
  13. public function from(){
  14. return $this->name.'出生于'.Stu::NATION;
  15. }
  16. }
  17. $stu=new Stu1;
  18. echo $stu->out(),'<br>';
  19. echo $stu->from();
  20. //结果
  21. // 小明来自实验小学
  22. // 小明出生于中国

接口

  • 接口实现了设计与分离

  • 接口内只能包含常量和方法的定义

  • 接口中定义的所有方法都必须是公有

  • 可以用接口实现多继承

  • 接口使用 implements 实现

接口演示

  1. <?php
  2. interface Stu1{
  3. const NAME='小明';
  4. public function from();
  5. }
  6. interface Stu2{
  7. public function out();
  8. }
  9. class Stu implements Stu1,Stu2{
  10. public $school='实验小学';
  11. const NATION ='中国' ;
  12. public function out(){
  13. return Stu1::NAME."来自{$this->school}";
  14. }
  15. public function from(){
  16. return Stu1::NAME.'出生于'.self::NATION;
  17. }
  18. }
  19. $stu=new Stu;
  20. echo $stu->out(),'<br>';
  21. echo $stu->from();
  22. //运行结果
  23. // 小明来自实验小学
  24. // 小明出生于中国

总结:总的来说继承是一种减少代码冗余的手段,抽象类和接口类都是为了实现将设计与实现分离,其中接口类实现了 php 的多继承

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议