博客列表 >PHP 继承抽象与接口

PHP 继承抽象与接口

蔚蓝世纪
蔚蓝世纪原创
2020年05月08日 19:39:20599浏览

一、继承

类的继承,也叫类的扩展。继承将会影响到类与类,对象与对象之间的关系。继承有三大功能:
  1. 继承:父类的二类成员自动成为子类的成员。
  2. 重写:覆写与父类/基类同名的成员(属性,方法)。
  3. 扩展:子类添加自身的方法来增加/扩展父类的功能。

代码举例:

  1. class User
  2. {
  3. public $name = 'apple';
  4. protected $number = '078';
  5. private $age= '31';
  6. // protected static $nationality: '中国/CHINA';
  7. public function write()
  8. {
  9. return "姓名 : {$this-> name} . 工号 :{$this-> number}";
  10. }
  11. }
  12. class Rob extends User
  13. {
  14. protected $number = '066';
  15. public function write()
  16. {
  17. //在子类中可以引用父类成员
  18. // parent::write()
  19. return parent::write() . ' 他的工作能力很强,可重点培养。' ;
  20. }
  21. protected $profession = ' IT大神';//属性扩展
  22. //方法扩展
  23. public function write1()
  24. {
  25. return parent::write() . "职业 : {$this->profession}" ;
  26. }
  27. }
  28. $User = new User;
  29. echo $User->write() . '<br>';
  30. $Rob = new Rob;
  31. echo $Rob->write() . '<br>';
  32. echo $Rob->write1() . '<br>';

输出效果:

二、抽象类的作用与实现

要理解什么是抽象类,就要先知道什么是抽象方法。我们在类里面定义的没有方法体的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字”abstract”来修饰。
如:

  1. abstract function fav1();
  2. abstract function fav2();

所以,只要一个类里面有一个方法是抽象方法,那么这个类就定义为抽象类,抽象类也要使用“abstract”关键字来修饰;在抽象类里面可以有不是抽象的方法和成员属性,但只要有一个方法是抽象的方法,这个类就必须声明为抽象类,使用“abstract”修饰。
如:

  1. abstract class User
  2. {
  3. var $test;
  4. abstract function fav1();
  5. abstract function fav2();
  6. function fav3(){
  7. ...
  8. }
  9. }

注意:

  1. 抽象类不能实例化,只能被继承。
  2. 任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
  3. 抽象类不一定有抽象方法,有抽象方法的类,一定是抽象类。
  4. 抽象方法的可见性不能是private
  5. 抽象方法在子类中,需要重写。
  6. 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
  7. 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
  8. 方法的调用方式必须匹配,即类型和所需参数数量必须一致。

代码:

  1. abstract class User
  2. {
  3. protected $name = '王二小';
  4. protected $age = 40;
  5. protected function write1()
  6. {
  7. return "姓名 : {$this-> name} . 工号 :{$this-> age}";
  8. }
  9. //只要一个类中有一个抽象方法,那么这个类就是:抽象类
  10. abstract protected function write2();
  11. }
  12. //实现类/工作类:是一个可以被实例化的普通类
  13. //工作类不一定是可以被实例化的普通类,也可以是一个抽象类
  14. //抽象类也可以被继承,抽象类也可以用在继承的上下文环境中
  15. class Rob extends User{
  16. protected $profession = ' IT大神';
  17. //必须将抽象类中的抽象方法实现
  18. protected function write2() {
  19. return parent::write1() . "职业 : {$this->profession}" ;
  20. }
  21. }
  22. //最终工作类:允许实例化
  23. class Work extends Rob
  24. {
  25. public function write2()
  26. {
  27. return parent::write2();
  28. }
  29. }
  30. $work = new Work();
  31. echo $work->write2();

输出效果:

三、接口的基本语法

什么是接口?
如果一个类中,所有的方法都是抽象方法,且没有成员属性,则这个类被称为接口(interface)。
  1. 使用接口,可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
  2. 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
  3. 接口中定义的所有方法都必须是公有,这是接口的特性。
  4. 要实现一个接口,使用 implements 操作符。
  5. 类中必须实现接口中定义的所有方法,否则会报一个致命错误。
  6. 类可以实现多个接口,用逗号来分隔多个接口的名称。
  7. 接口也可以继承,通过使用 extends 操作符。
  8. 接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
  1. interface iUser
  2. {
  3. //接口常量
  4. const NATION = '中国';
  5. //接口方法
  6. public static function write();
  7. }
  8. class User implements iUser
  9. {
  10. protected static $name = '丁一';
  11. public static function write()
  12. {
  13. return self::$name . ' 的国籍是 : ' . iUser::NATION;
  14. }
  15. }
  16. echo User::write();

输出效果:

总结

1.类的继承,类似于a=b,b=c,所以a=c,这个等式被用在函数和类中,大大方便了程序员的工作,因为你只需要修改或者重新定义一个属性即可实现联动效果,而不必逐个修改属性的值。
2.如果不想要类方法被重写,可以在类方法或类前加上”final”一词即可。
3.既然抽象类不能被实例化,为什么还要设置一个抽象类呢。这是因为抽象类往往用来表征对问题领域进行分析、设计而得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象总结。比如,在一个图形编辑软件的分析设计过程中,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域并不是直接存在的,它就是一个抽象概念。而正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
4.接口类似于课代表,它是各科老师和同学们的连接桥梁,一个课代表对应一科老师,对应全班的同学。所以抽象类只能单继承,但接口却是多继承,类对接口的实现也是多实现。
5.终于明白程序员多么渴望拥有一个浓密帅炸的发型了。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议