Blogger Information
Blog 34
fans 0
comment 0
visits 20183
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类的扩展、抽象及接口和命名空间
OC的PHP大牛之路
Original
596 people have browsed it

类的扩展、抽象及接口

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'
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
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