博客列表 >php继承的三大功能,抽象与接口

php继承的三大功能,抽象与接口

老陈
老陈原创
2020年04月29日 14:11:50626浏览

1.继承三大功能(继承,重写,扩展)

1.1继承 :父类的二类成员自动成为子类的成员

二类成员: 子类有权访问的父类成员类型, public,protected
通过 extends关键字继承父类
  1. //父类
  2. class Father{
  3. //公开属性
  4. public $name = '张三';
  5. public $age = 40;
  6. //受保护属性
  7. protected $like = '摄影';
  8. //私有属性
  9. private $money = 12000;
  10. //公开方法
  11. public function fat1(){
  12. return "姓名:{$this->name}<br>年龄:{$this->age}<br>爱好:{$this->like}";
  13. }
  14. public function fat2(){
  15. return "姓名:{$this->name}<br>年龄:{$this->age}<br>爱好:{$this->like}<br>工资:{$this->money}";
  16. }
  17. }
  18. //Body子类 继承(extends) Father父类
  19. class Body extends Father {
  20. }
  21. $father = new Father();
  22. echo $father->fat1();
  23. echo '<hr>';
  24. $body = new Body();
  25. //通过子类在外部访问父类中的公开属性
  26. echo $body->name;
  27. echo $body->age;
  28. echo '<hr>';
  29. //通过子类访问父类中的公开方法
  30. echo $body->fat1();
  31. echo '<hr>';
  32. echo $body->fat2();

1.2重写:重写与父类同名的(属性, 方法)

  1. class Father{
  2. public $name = '张三';
  3. public $age = 40;
  4. protected $like = '摄影';
  5. private $money = 12000;
  6. public function fat1(){
  7. return "姓名:{$this->name}<br>年龄:{$this->age}<br>爱好:{$this->like}";
  8. }
  9. public function fat2(){
  10. return "姓名:{$this->name}<br>年龄:{$this->age}<br>爱好:{$this->like}<br>工资:{$this->money}";
  11. }
  12. }
  13. class Body extends Father {
  14. //重写父类属性
  15. protected $like = '钓鱼';
  16. //重写父类方法
  17. public function fat1(){
  18. return parent::fat1().'<br>最近又喜欢上钓鱼了~~!';
  19. }
  20. public function fat2(){
  21. //重写父类方法不能调用父类的私有属性
  22. return "姓名:{$this->name}<br>年龄:{$this->age}<br>爱好:{$this->like}<br>工资:{$this->money}";
  23. }
  24. }
  25. $father = new Father();
  26. echo $father->fat2();
  27. echo '<hr>';
  28. $body = new Body();
  29. //访问子类重写方法
  30. echo $body->fat1();
  31. echo '<hr>';
  32. echo $body->fat2();

1.3 扩展: 子类添加自身的方法来增加/扩展父类的功能

  1. class Father{
  2. public $name = '张三';
  3. public $age = 40;
  4. protected $like = '摄影';
  5. private $money = 12000;
  6. public function fat1(){
  7. return "姓名:{$this->name}<br>年龄:{$this->age}<br>爱好:{$this->like}";
  8. }
  9. }
  10. class Body extends Father {
  11. //扩展属性
  12. protected $profession = '医生';
  13. //重写父类方法
  14. public function fat1(){
  15. return parent::fat1().'<br>最近又喜欢上钓鱼了~~!';
  16. }
  17. //扩展方法
  18. public function fat3(){
  19. return "姓名:{$this->name}<br>年龄:{$this->age}<br>职业:{$this->profession}";
  20. }
  21. }
  22. $father = new Father();
  23. echo $father->fat1();
  24. echo '<hr>';
  25. $body = new Body();
  26. echo $body->fat1();
  27. echo '<hr>';
  28. echo $body->fat3();

2.抽象类:部分分离了设计与实现

抽象类中完成设计,工作类中完成实现
通过abstract关键字来定义抽象类
描述:1.抽象方法没有方法体。2.只要一个类中有一个抽象方法, 那么这个类就是抽象类。3.抽象类不能被实例化,但是可以被子类继承。
  1. // 方法一:
  2. // 设计类
  3. abstract class Father{
  4. protected $name = '张三';
  5. protected $age = 40;
  6. protected $like = '摄影';
  7. // 只要一个类中有一个抽象方法, 那么这个类就是抽象类
  8. // 抽象方法:没有方法体
  9. abstract protected function fat1();
  10. }
  11. //工作类
  12. class Body extends Father {
  13. private $money = 12000;
  14. // 必须将抽象类中的抽象方法实现
  15. public function fat1(){
  16. return "姓名:{$this->name}<br>年龄:{$this->age}<br>爱好:{$this->like}<br>工资:{$this->money}";
  17. }
  18. }
  19. $body = new Body();
  20. echo $body->fat1();
  21. // 方法二;
  22. // 设计类
  23. abstract class Father{
  24. protected $name = '张三';
  25. protected $age = 40;
  26. protected $like = '摄影';
  27. protected function fat1(){
  28. return "姓名:{$this->name}<br>年龄:{$this->age}<br>爱好:{$this->like}";
  29. }
  30. // 只要一个类中有一个抽象方法, 那么这个类就是抽象类
  31. // 抽象方法:没有方法体
  32. abstract protected function fat2();
  33. }
  34. // 工作类不一定是可以被实例化的普通类,也可是一个抽象类
  35. abstract class Body extends Father {
  36. private $money = 12000;
  37. // 必须将抽象类中的抽象方法实现
  38. protected function fat2(){
  39. return parent::fat1() ."<br>工资:{$this->money}";
  40. }
  41. }
  42. // 最终工作类: 允许实例化
  43. class Bodys extends Body {
  44. public function fat2(){
  45. return parent::fat2();
  46. }
  47. }
  48. $bodys = new Bodys();
  49. echo $bodys->fat2();

3.接口:完全分离了”设计与实现”

关键字: interface
描述:1.使用与类相似的语法: 抽象方法, 常量, 构造方法(魔术方法的一种)2. 默认访问控制必须是public。3. 接口允许多继承, 从而间接实现了PHP的多继承。
  1. // 1、单接口
  2. interface iFather{
  3. // 接口常量
  4. const NATION = '中国';
  5. // 接口方法
  6. public static function fat1();
  7. }
  8. // 工作类实现接口
  9. class Body implements iFather
  10. {
  11. protected static $name = '张三';
  12. // 接口中的抽象方法,必须在工作类实现
  13. public static function fat1()
  14. {
  15. return self::$name . ' 的国籍是: ' . iFather::NATION;
  16. }
  17. }
  18. echo Body::fat1();

个人理解:

1、子类自动继承父类的public和protected属性和方法,子类可以重写父类同名的public和protected属性和方法,也可以在子类中扩展父类没有的属性和方法。
2、类中只要有一个抽象方法,那么就是抽象类。抽象类不能被实例化,但可以被继承,继承的子类也可以是抽象类。
3.接口允许多继承,并且默认访问控制必须是public。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议