Blogger Information
Blog 94
fans 0
comment 0
visits 92699
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
【PHP】类的静态成员和继承
可乐随笔
Original
1420 people have browsed it

类的静态成员和继承

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;
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post