博客列表 >【PHP】类的静态成员和继承

【PHP】类的静态成员和继承

可乐随笔
可乐随笔原创
2022年12月26日 15:42:081419浏览

类的静态成员和继承

1.类的静态成员
2.类的继承
3.接口
4.静态成员/动态绑定成员的调用者

1.类的静态成员

  1. <?php
  2. use Demo as GlobalDemo;
  3. class Demo
  4. {
  5. // 类常量
  6. public const courses = ['前端', '后端', '全栈'];
  7. //静态成员:属性,方法
  8. //静态属性
  9. public static string $siteName = 'PHP中文网';
  10. //静态方法
  11. public static function say()
  12. {
  13. //使用类访问,this是需要实例化的
  14. //self:类引用
  15. return self::$siteName . join(',', self::courses) . '课程';
  16. }
  17. //拦截非静态方法
  18. public function __call($name, $arguments)
  19. {
  20. return '这是非静态方法返回';
  21. }
  22. //拦截静态方法
  23. public static function __callStatic($name, $arguments)
  24. {
  25. return $name .' (' .implode(',',$arguments) . ')';
  26. }
  27. }
  28. //换行,PHP_EOL
  29. echo Demo::say() . PHP_EOL;
  30. //外部非法访问静态属性,不能被自动拦截/委托
  31. //但是静态方法或被拦截/委托
  32. echo Demo::filed('id','name','email') .PHP_EOL;
  33. //访问一个不存的方法
  34. echo (new Demo())->hello() .PHP_EOL;

2.类的继承

  1. <?PHP
  2. // protected:受保护成员
  3. // extends:继承
  4. // parent:父类引用
  5. class Demo1
  6. {
  7. //public:公开成员,本类,子类,类外均可访问无限制
  8. public string $name;
  9. //private:私有成员,仅限本类访问
  10. private float $buyCost;
  11. //protected:受保护成员,仅限当前类/子类使用,外部不可见
  12. protected int $num;
  13. //构造器
  14. public function __construct($name, $buyCost, $num)
  15. {
  16. $this->name = $name;
  17. $this->buyCost = $buyCost;
  18. $this->num = $num;
  19. }
  20. //格式化输出
  21. public function show()
  22. {
  23. return <<< SHOW
  24. 1.品名: $this->name
  25. 2.价格: $this->buyCost
  26. 3.数量: $this->num\n
  27. SHOW;
  28. }
  29. }
  30. $obj1 = new Demo1('手机', 5000, 3);
  31. echo $obj1->show() . PHP_EOL;
  32. //----------------------------
  33. echo '-------------------------'.PHP_EOL;
  34. //子类
  35. class Demo2 extends Demo1
  36. {
  37. //子类:扩展父类功能
  38. public string $brand;
  39. //重写构造器,扩展更多属性和方法
  40. public function __construct($name, $buyCost, $num, $brand)
  41. {
  42. parent::__construct($name, $buyCost, $num);
  43. $this->brand = $brand;
  44. }
  45. //重写输出
  46. public function show()
  47. {
  48. return parent::show(). <<< SON
  49. 4.品~牌: $this->brand
  50. SON;
  51. }
  52. }
  53. $obj2 = new Demo2('电脑', 10000, 2,'联想');
  54. echo $obj2->show() . PHP_EOL;

3.接口

  1. <?php
  2. /**
  3. * 1.interface:定义接口
  4. * 2.implements:实现接口
  5. * 3.abstract:声明抽象类,抽象方法
  6. * 4.trait:组合式继承
  7. */
  8. // 接口
  9. interface idemo
  10. {
  11. //所有成员必须公开
  12. public const GENDER = '男';
  13. //所有方法全部抽象(只有声明,没有实现)
  14. public function sum($a, $b);
  15. public function sub($a, $b);
  16. public function mul($a, $b);
  17. public function div($a, $b);
  18. }
  19. //接口不能直接用,必须要用到工作类来实现它
  20. // 实现类 /工作类
  21. class Work implements idemo
  22. {
  23. //接口中的抽象方法全部实现
  24. public function sum($a, $b)
  25. {
  26. return $a + $b;
  27. }
  28. public function sub($a, $b)
  29. {
  30. return $a - $b;
  31. }
  32. public function mul($a, $b)
  33. {
  34. return $a * $b;
  35. }
  36. public function div($a, $b)
  37. {
  38. return $b !== 0 ? $a / $b : '除0错';
  39. }
  40. }
  41. // 实现类 /抽象类
  42. abstract class aWork implements idemo
  43. {
  44. //接口中的抽象方法全部实现
  45. public function sum($a, $b)
  46. {
  47. return $a + $b;
  48. }
  49. public function sub($a, $b)
  50. {
  51. return $a - $b;
  52. }
  53. //没有实现的方法,在抽象类中可声明为抽象方法
  54. //包含抽象方法的类,一定是抽象类,不能直接实例化使用
  55. //必须使用它的子类,将抽象方法功能完善后,才能实例化
  56. abstract public function mul($a, $b);
  57. abstract public function div($a, $b);
  58. }
  59. //抽象类不能直接实例化使用,必须使用它的子类来使用
  60. //工作类
  61. class Work1 extends aWork
  62. {
  63. //接口中的抽象方法全部实现
  64. public function mul($a, $b)
  65. {
  66. return $a * $b;
  67. }
  68. public function div($a, $b)
  69. {
  70. return $b !== 0 ? $a / $b : '除0错';
  71. }
  72. }
  73. echo (new Work())->mul(3, 5) . PHP_EOL;
  74. echo (new Work())->div(4, 0) . PHP_EOL;
  75. //实例化子类后,调用父类的方法
  76. echo (new Work1())->sum(5, 7) . PHP_EOL;
  77. echo (new Work1())->sub(8, 2) . PHP_EOL;
  78. // 接口:全抽象
  79. // 抽象类:部分抽象
  80. // 工作类:没有抽象
  81. // PHP 默认单继承: 只能从一个父类中继承成员
  82. // PHP 也能实现类似的多继承: PHP允许从多个接口中获取成员
  83. // 多接口 -> 多继承
  84. // interface iTest1
  85. // {
  86. // public cosnt A = 1;
  87. // }
  88. // interface iTest2
  89. // {
  90. // public cosnt B = 2;
  91. // }
  92. // interface iTest3
  93. // {
  94. // public cosnt C = 3;
  95. // }
  96. // class Show implements iTest1,iTest2,iTest3
  97. // {
  98. // }
  99. // echo Show::A .PHP_EOL;
  100. // echo Show::B .PHP_EOL;
  101. // echo Show::C .PHP_EOL;
  102. // 接口:工作清单
  103. interface iCURD
  104. {
  105. public static function insert();
  106. public static function delete();
  107. public static function update();
  108. public static function select();
  109. }
  110. // 由功能组合式实现多继承 trait
  111. // trait : 工具箱,基于类的语法,但和接口一样,不能实例化
  112. trait t1
  113. {
  114. public function d($data)
  115. {
  116. // var_dump($date);
  117. }
  118. }
  119. trait t2
  120. {
  121. public function sum($a, $b, ...$args)
  122. {
  123. return $a + $b + array_sum($args);
  124. }
  125. }
  126. // 工作类
  127. class Work2 extends Work1
  128. {
  129. //引入工具箱: t2 后,就会屏蔽 Work1 类中的方法
  130. // * 优先级说明: 当前类 同名成员 > trait成员 > 继承成员
  131. use t2;
  132. public function sum($a, $b)
  133. {
  134. return $a + $b;
  135. }
  136. }
  137. echo (new Work2)->sum(10, 20) .PHP_EOL;
  138. echo (new Work2)->sum(10, 20, 30, 40) .PHP_EOL;

4.静态成员/动态绑定成员的调用者

  1. <?php
  2. //static::静态成员/动态绑定成员的调用者
  3. use Demo1 as GlobalDemo1;
  4. class Demo1{
  5. public static function getMethod()
  6. {
  7. return __METHOD__ .'()';
  8. }
  9. public static function show()
  10. {
  11. $resule = '';
  12. // self:静态绑定,永远和当前类进行绑定,也叫编译绑定
  13. // static:动态绑定,和调用类进行绑定,也叫运行时绑定
  14. $result = '静态绑定: '.self::getMethod();
  15. $result = '动态绑定: '.static::getMethod();
  16. return $result;
  17. }
  18. }
  19. class Demo2 extends Demo1
  20. {
  21. public static function getMethod()
  22. {
  23. return __METHOD__ .'()';
  24. }
  25. }
  26. //类的静态方法可以直接访问
  27. echo Demo1::getMethod() .PHP_EOL;
  28. echo Demo1::show() .PHP_EOL;
  29. echo Demo2::Show() .PHP_EOL;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议