博客列表 >类的继承、重写和扩展以及抽象类和接口以及trait在使用过程中的注意事项

类的继承、重写和扩展以及抽象类和接口以及trait在使用过程中的注意事项

程东旭
程东旭原创
2020年04月30日 17:04:01822浏览

演示代码

  1. <?php
  2. //建立一个trait,添加一个格式化打印的方法
  3. trait tDemo
  4. {
  5. public function write()
  6. {
  7. //get_class_vars的作用是获取改函数名西门所有的属性
  8. $props = get_class_vars(__CLASS__);
  9. printf('<pre>%s</pre>', print_r($props,true));
  10. }
  11. public static function user()
  12. {
  13. return self::$name . 'user0的年龄是' . self::$age . ',邮箱是' . self::$email;
  14. }
  15. }
  16. //建立一个普通类,use trait tDemo
  17. class User1
  18. {
  19. use tDemo;
  20. public static $name = '程东旭';
  21. public static $age = 30;
  22. public static $email = 'chengdongxu@php.cn';
  23. public static function user()
  24. {
  25. return self::$name . 'user1的年龄是' . self::$age . ',邮箱是' . self::$email;
  26. }
  27. }
  28. echo User1::user();
  29. (new user1) -> write();
  30. echo '<hr>';
  31. //一、实例演示类的三大功能:继承、重写、扩展
  32. //1、实例演示实现类的继承
  33. class User2 extends user1
  34. {
  35. use tDemo;
  36. public static $name = '韩伟';
  37. public static $age = 29;
  38. public static $email = 'hanwei@php.cn';
  39. }
  40. echo User2::user();
  41. (new User2) -> write();
  42. echo '<hr>';
  43. //2、实例演示实现类的重写
  44. class User3 extends user1
  45. {
  46. use tDemo;
  47. public static $name = '马飞';
  48. public static $age = 32;
  49. public static $email = 'mafei@php.cn';
  50. public static function user()
  51. {
  52. return self::$name . '的年龄是' . self::$age . ',邮箱是' . self::$email;
  53. }
  54. }
  55. echo User3::user();
  56. (new User3) -> write();
  57. echo '<hr>';
  58. //演示子类中方法级别大于trait,trait的级别大于父类
  59. class User0 extends user1
  60. {
  61. use tDemo;
  62. public static function user()
  63. {
  64. return self::$name . 'user3的年龄是' . self::$age . ',邮箱是' . self::$email;
  65. }
  66. }
  67. echo User0::user();
  68. (new User0) -> write();
  69. echo '<hr>';
  70. //3、实例演示实现类的扩展
  71. class User4 extends user1
  72. {
  73. public static $phone = 'apple';
  74. public static function user()
  75. {
  76. return self::$name . '的年龄是' . self::$age . ',邮箱是' . self::$email . ',用的手机是' . self::$phone;
  77. }
  78. }
  79. echo User4::user();
  80. echo '<hr>';
  81. //二、实例演示抽象类
  82. //建立一个抽象类,只要在类的方法中包含有没有实现的方法就叫做抽象类,抽象类不能被实例
  83. //继承抽象类必须将父类中的抽象方法必须全部实现
  84. //抽象类中可以有实现的方法,也可以有没有实现的方法
  85. abstract class User5
  86. {
  87. public static $name = '程东旭';
  88. public static $age = 30;
  89. public static $email = 'chengdongxu@php.cn';
  90. abstract public static function user();
  91. }
  92. class User6 extends User5
  93. {
  94. protected static $phone = 'apple';
  95. public static function user()
  96. {
  97. return self::$name . '的年龄是' . self::$age . ',邮箱是' . self::$email . ',用的手机是' . self::$phone;
  98. }
  99. }
  100. echo User6::user();
  101. echo '<hr>';
  102. //三、实例演示接口
  103. //接口中不能有实现的方法,必须所有的方法都是未实现
  104. //接口可以实现多继承
  105. interface iUser1
  106. {
  107. const NATION1 = 'USA';
  108. public static function user();
  109. }
  110. interface iUser2
  111. {
  112. const NATION2 = 'CHINA';
  113. public static function write();
  114. }
  115. //接口的实现,工作类
  116. class User8 implements iUser1, iUser2
  117. {
  118. public static $name = '程东旭';
  119. public static function user()
  120. {
  121. return iUser1::NATION1;
  122. }
  123. public static function write()
  124. {
  125. return self::$name;
  126. }
  127. }
  128. //客户端操作
  129. echo User8::user() . '<br>';
  130. echo User8::write();
  131. //接口中允许存在的成员有:常量、动态方法、静态方法,不允许定义的成员有变量、静态属性、抽象方法、静态抽象方法
  132. interface saaa
  133. {
  134. //常量
  135. public const NAME = 'chengdongxu';
  136. //方法
  137. public function aaa();
  138. //静态方法
  139. public static function ccc();
  140. }

总结

1、子类中方法使用的优先级:子类 > trait > 父类

2、抽象类是指普通类中包含至少一个没有被实现的方法,抽象类不能被实例,抽象类的子类必须全部实现父类中的抽象方法;如果继承抽象类的还是一个抽象类,就不需要全部实现父类中的所有方法

3、接口必须是所有的方法都没有被实现,不能被实例,接口的实现类必须实现接口中定义的所有方法,一个实现类可以一次性同时实现多个接口

4、接口中允许定义的成员有:常量、动态方法、静态方法,不允许定义的成员有变量、静态属性、抽象方法、静态抽象方法

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