博客列表 >类的扩展、抽象及接口和命名空间

类的扩展、抽象及接口和命名空间

OC的PHP大牛之路
OC的PHP大牛之路原创
2022年08月17日 16:03:08594浏览

类的扩展、抽象及接口

protected 可继承成员
extends 类成员的来源
parent父类引用

  1. class Person
  2. {
  3. // 1. 属性
  4. // public: 公共成员, 当前类, 类外部
  5. // public string $email = 'a@qq.com';
  6. // private: 私有成员, 仅限当前类,类外部不可见
  7. private int $id = 10;
  8. // protected: 受保护的, 用在当前类,以及他的子类
  9. protected string $name;
  10. // public > protected > private
  11. // 类中,类外,子类: public
  12. // 类中,子类: protected
  13. // 类中: private
  14. // 2. 方法
  15. public function __construct($name)
  16. {
  17. $this->name = $name;
  18. }
  19. // 自定义方法
  20. protected function getInfo(): string
  21. {
  22. return $this->name;
  23. }
  24. }

扩展

  1. class Stu extends Person
  2. {
  3. // extends: 相当于把父类代码复制到当前类中(除Private成员外)
  4. // 只需要扩展父类中的:"属性和方法"
  5. // 1. 属性扩展
  6. // 之前
  7. // protected string $name;
  8. // 扩展的
  9. private string $lesson;
  10. private int $score;
  11. // 2. 方法扩展
  12. // 构造方法
  13. public function __construct($name, $lesson, $score)
  14. {
  15. // parent: 引用父类
  16. parent::__construct($name);
  17. $this->lesson = $lesson;
  18. $this->score = $score;
  19. }
  20. // protected -> public
  21. public function getInfo(): string
  22. {
  23. return parent::getInfo() . '同学, (' . $this->lesson .
  24. ' ) , 成绩: ' . $this->score .'<br>';
  25. }
  26. }
  27. $stu = new Stu('小张', 'php', 90);
  28. echo $stu->getInfo() ;

抽象类

禁用父类, 仅允许通过它的子类来访问父类成员
把当前类,声明为”抽象类”: abstract
如果类中有抽象方法,则这个类必须声明为抽象类

  1. abstract class Demo1
  2. {
  3. public string $name = 'admin';
  4. // 如果某个方法没有具体实现,应该声明成抽象方法
  5. abstract public static function getInfo($name);
  6. }
  7. class Demo2 extends Demo1
  8. {
  9. // 在子类中, 必须将父类中的抽象方法实现了
  10. public static function getInfo($name)
  11. {
  12. return 'Hello, ' .$name;
  13. }
  14. }
  15. echo Demo2::getInfo('朱老师');

接口类

升级版的”抽象类”

  1. // 接口类
  2. interface iUser
  3. {
  4. // 常量
  5. public const NATION = 'CHINA';
  6. // 方法: public
  7. public function m1();
  8. public function m2();
  9. }
  10. // 工作类: 实现了接口的类
  11. class Demo1 implements iUser
  12. {
  13. // 接口的抽象方法,必须在工作类中全部实现
  14. public function m1()
  15. {
  16. }
  17. public function m2()
  18. {
  19. }
  20. }
  21. // 如果实现类仅实现了接口的一部分抽象方法,应该声明为抽象类
  22. abstract class Demo2 implements iUser
  23. {
  24. public function m1()
  25. {
  26. }
  27. }
  28. class Demo3 extends Demo2
  29. {
  30. public function m2()
  31. {
  32. }
  33. }
  34. // php是单继承
  35. interface A
  36. {
  37. }
  38. interface B
  39. {
  40. }
  41. interface C
  42. {
  43. }
  44. // Test类,同时从三个接口中获取成员,间接实现了"多继承"
  45. class Test implements A, B, C
  46. {
  47. }
  48. interface iDb
  49. {
  50. // insert
  51. public static function insert(array $data);
  52. // update
  53. public static function update(array $data, string $where);
  54. // delete
  55. public static function delete(string $where);
  56. // select
  57. public static function select(array $options);
  58. }
  59. abstract class aDb
  60. {
  61. // insert
  62. public static function insert(array $data)
  63. {
  64. }
  65. // update
  66. public static function update(array $data, string $where)
  67. {
  68. }
  69. // delete
  70. public static function delete(string $where)
  71. {
  72. }
  73. }
  74. class Db extends aDb
  75. {
  76. }

命名空间

全局成员

全局成员: 函数, 常量, 类/接口,全局有效, 禁止重复声明

  1. function hello()
  2. {
  3. }
  4. const A =1;
  5. class D
  6. {
  7. }
  8. // 将第二个hello 声明到另一个空间中,不会重名了
  9. namespace _0815_1;
  10. function hello()
  11. {
  12. }
  13. const A = 2;
  14. class D
  15. {
  16. }

跨空间

  1. class Demo1
  2. {
  3. public static string $name = 'admin';
  4. }
  5. // 当存在命名空间时, 全局成员应该使用完整的名称
  6. // 完整类名 = 空间名称\类名
  7. // ::class 获取类的完整名称
  8. echo Demo1::class . '<br>';
  9. echo \two\Demo1::$name;
  10. namespace two;
  11. class Demo1
  12. {
  13. public static string $name = '猪老师';
  14. }
  15. echo Demo1::class . '<br>';
  16. // 跨空间访问
  17. // echo one\Demo1::$name;
  18. // 跨空间访问时,必须从根空间/全局空间开始查询: \
  19. echo \one\Demo1::$name;
  20. // 实际访问的是: 'two\one\Demo1'
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议