博客列表 >类声明-实例化-成员-继承-trait特征类

类声明-实例化-成员-继承-trait特征类

葡萄枝子
葡萄枝子原创
2021年02月03日 00:23:24762浏览

类声明-实例化-成员-继承-trait特征类

  1. 实例演示类声明,类的实例化,类的静态成员与类的扩展;
  2. 描述trait功能,以及trait与父类的区别与联系,并实例演示trait 的冲突与优先级的解决方案

1. 实例演示类声明,类的实例化,类的静态成员与类的扩展;

  1. // 实例演示类声明,类的实例化,类的静态成员与类的扩展;
  2. // class 声明一个类
  3. class ParentClass
  4. {
  5. // 私有属性:当前类中使用
  6. private $id;
  7. // 受保护的属性:当前和扩展类中使用
  8. protected $slug;
  9. // 公开属性:外部可访问
  10. public $title;
  11. // 静态属性
  12. public static $num;
  13. // 构造方法
  14. public function __construct($id, $slug, $title, $num)
  15. {
  16. $this->id = $id;
  17. $this->slug = $slug;
  18. $this->title = $title;
  19. // 静态成员赋值
  20. self::$num = $num;
  21. }
  22. // 公开方法
  23. public function show()
  24. {
  25. return sprintf('id=%d, slug=%s, title=%s, num=%d', $this->id, $this->slug, $this->title, self::$num);
  26. }
  27. }
  28. // 类的实例化
  29. $parentClass = new ParentClass(7, 'seven', 'title-seven', 77);
  30. // 访问公开属性
  31. // title-seven
  32. echo $parentClass->title, '<br>';
  33. // 访问公开静态属性
  34. // 77
  35. echo ParentClass::$num, '<br>';
  36. // 访问公开方法
  37. // id=7, slug=seven, title=title-seven, num=77
  38. echo $parentClass->show(), '<br>';
  39. // 声明一个扩展类
  40. class SubClass extends ParentClass
  41. {
  42. // 子类私有属性
  43. private $child;
  44. // 子类构造方法
  45. public function __construct($id, $slug, $title, $num, $child)
  46. {
  47. // 调用父类构造方法
  48. parent::__construct($id, $slug, $title, $num);
  49. // 设置私有属性
  50. $this->child = $child;
  51. }
  52. // 子类覆盖父类方法
  53. public function show()
  54. {
  55. // 调用父类方法和自己本身的私有方法
  56. return parent::show() . ', ' . $this->child();
  57. }
  58. // 子类自己的私有方法
  59. private function child() {
  60. return $this->child;
  61. }
  62. }
  63. // 扩展类实例化
  64. $subClass = new SubClass(10, 'ten', 'title-ten', 10, 'has a child');
  65. // id=10, slug=ten, title=title-ten, num=10, has a child
  66. echo $subClass->show(), '<br>';

类声明

2. 描述trait功能,以及trait与父类的区别与联系,并实例演示trait 的冲突与优先级的解决方案

  • trait 特征类,提供一组公共方法集,借用类的语法实现,特征类本身不能实例化。

  • 父类,可以实例化。

  • trait 特征类,类使用 use 关键字,实现代码复用特征类中的方法。

  • 父类,类使用 extends 扩展父类,实现代码复用父类中的方法。

  • 类同时扩展父类,又使用 trait 特征类,同名方法优先级是:类自身中的方法 > trait 特征类 > 扩展的父类

  1. // 描述trait功能,以及trait与父类的区别与联系,并实例演示trait 的冲突与优先级的解决方案
  2. // 描述trait功能,以及trait与父类的区别与联系
  3. // trait 特征类
  4. trait P1
  5. {
  6. public function hello()
  7. {
  8. return 'hello trait!';
  9. }
  10. }
  11. // 声明一个父类
  12. class P2
  13. {
  14. public function hello()
  15. {
  16. return 'hello parent!';
  17. }
  18. }
  19. // 声明一个类使用特征类方法
  20. class S1
  21. {
  22. // 使用 P1 特征类中方法
  23. use P1;
  24. // hello trait!
  25. function show()
  26. {
  27. return $this->hello();
  28. }
  29. }
  30. $s1 = new S1;
  31. // hello trait!
  32. echo $s1->show(), '<br>';
  33. // 声明一个扩展类使用父类方法
  34. class S2 extends P2
  35. {
  36. public function show()
  37. {
  38. // hello parent!
  39. return $this->hello();
  40. }
  41. }
  42. $s2 = new S2;
  43. // hello parent!
  44. echo $s2->show(), '<br>';
  45. // 声明一个类,扩展父类,又使用特征类
  46. class S3 extends P2
  47. {
  48. // 使用特征类中方法
  49. use P1;
  50. public function show()
  51. {
  52. // hello trait!
  53. return $this->hello();
  54. }
  55. }
  56. $s3 = new S3;
  57. // hello trait!
  58. echo $s3->show(), '<br>';
  59. // 实例演示trait 的冲突与优先级的解决方案
  60. trait T1 {
  61. public function t() {
  62. return 'Trait T1';
  63. }
  64. }
  65. trait T2 {
  66. public function t() {
  67. return 'Train T2';
  68. }
  69. }
  70. class S {
  71. use T1, T2 {
  72. // 优先级
  73. T1::t insteadof T2;
  74. // 别名
  75. T2::t as t2;
  76. }
  77. }
  78. // Trait T1
  79. echo (new S)->t(), '<br>';
  80. // Train T2
  81. echo (new S)->t2(), '<br>';

父类trait类

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