博客列表 >类与对象以及接口和命名空间

类与对象以及接口和命名空间

xueblog9的进阶之旅
xueblog9的进阶之旅原创
2022年08月17日 19:53:08637浏览

类与对象

  1. 封装
    1.1 private :私有,封装
    1.2 变量一般放到数组里面
    1.3 类中数组的数据访问,访问数组,直接__get()传参即可,访问数组内部,需要用到array_key_exists()判断键位是否在数组内,从而返回数组的值
  2. 属性重载:get(属性),set(属性,值)
  3. 方法重载:call(方法名,参数)-动态,callStatic(方法名,参数)-静态

类的扩展/抽象/最终

  1. 扩展:extends,可继承成员:属性:protected,public,方法,构造方法,需要constract引入父类重新占位,为了传参,例:parent::constract;
  2. 抽象类:abstract,父类为抽象类之后,无法实例化使用,必须通过子类实现父类的方法,父类方法存在抽象方法时,父类必须定义为抽象类,
  3. 最终类:final:最终类声明关键字,必须将方法实现,无法再继续扩展
  4. 优先级:pulic(类中,类外,子类) > protected(类中,子类) > private(类中)

接口

  1. 升级版的抽象类
  2. 声明方法:interface ixxx,类名首字母带一个’i’;
  3. 方法:必须是public
  4. 工作类(接口的子类):实现了接口的类,声明格式:class xxx implements ixxx
  5. 子类:abstract声明后,可以只实现接口的一部分抽象方法,否则会报错
  6. 工作类继承自抽象类,抽象类继承自接口,其中抽象类可实现部分功能,但是在工作类中必须实现全部的抽象类中未实现的方法
  7. 继承接口方法:implements,

命名空间

  1. 全局成员:函数,常量,类/接口,全局有效,禁止重复声明
  2. ::class :获取类的完整名称
  3. 跨空间访问必须从根空间/全局空间开始查询: ‘\’;
  4. 命名空间理解就是在当前目录下,创建了虚拟路径(或者虚拟文件夹),此时文件名必须加上命名空间名,目的为了解决全局成员之间的命名冲突的问题,方便管理
  5. 跨空间调用,类和函数以及接口可以不按照顺序使用,但是常量必须声明在前,如一个文件中两个命名空间,第二个命名空间可以访问第一个空间内的常量,反之则无法访问;

命名空间的类型(namespace)

  1. 当前路径:非限定名称,直接当前目录查找
  2. 相对路径:限定名称,在当前目录的子目录中查找
  3. 绝对路径:完全限定名称,在根空间进行查找
  4. 空间可分层管理 namespace xx\xx,’\’分层

命名冲突的

  1. 访问方式: 路径::$变量名;
  2. 路劲过长起别名:use 绝对路径 as 别名

其他

  1. METHOD:返回当前方法名称

案例源码

  1. <?php
  2. use _0815\D;
  3. use _0815\Demo2 as _0815Demo2;
  4. use _0815\Demo3;
  5. use Demo2 as GlobalDemo2;
  6. namespace six;
  7. class Demo {
  8. private $data = ['a'=>'结果1','b'=>'结果2','c'=>'结果3'];
  9. private $data2 = '这仅仅是个测试';
  10. public $text = '10';
  11. public $text2 = '20';
  12. protected $text3 = '30';
  13. // 访问数组中的单值
  14. public function __get($name)
  15. {
  16. if(array_key_exists($name,$this->data)){
  17. return $this->data[$name]; // 访问数组的元素,数组名不需要加'$';
  18. }else{
  19. // 访问数组,或者访问单值
  20. return $this->data2;
  21. }
  22. // return array_key_exists($name,$this->data)? $this->data[$name] : return $this->data2;
  23. }
  24. }
  25. $getData = new Demo;
  26. // echo $getData->b;
  27. echo $getData->a.'<hr>';
  28. echo $getData->data4.'<hr>';
  29. // 统一个类中无法反复声明__get()函数,引用不同的数据类型可以使用新增类,或者定义一个子类,
  30. // 通过继承父类的protected,public,方法,构造方法(需要引入父类进行占位,为了传参);
  31. class Demo2 extends Demo{
  32. public function __get($name)
  33. {
  34. return $this -> $name;
  35. }
  36. }
  37. $getData2 = new Demo2;
  38. echo $getData2->text.'<hr>';
  39. class Test
  40. {
  41. protected string $txt;
  42. // public string $txt2;
  43. private $txt3 = '我是父类的私有变量';
  44. public function __construct($txt,$txt2)
  45. {
  46. $this->txt = $txt;
  47. $this->txt2 = $txt2;
  48. }
  49. protected function getInfo():string
  50. {
  51. return $this->txt.' '.$this->txt2;
  52. // return ;
  53. }
  54. }
  55. // 扩展子类
  56. class Test1 extends Test
  57. {
  58. private string $txt4;
  59. public function __construct($txt,$txt2,$txt4)
  60. {
  61. // 引用父类得构造器占位,一个就够了,不需要两个construct
  62. parent::__construct($txt,$txt2);
  63. // parent::__construct($txt2);
  64. $this -> txt4 = $txt4;
  65. }
  66. public function getInfo(): string
  67. {
  68. return parent::getInfo() . '....' .$this->txt4;
  69. }
  70. }
  71. $Demo6 = new Test1('hello','world','我在子类里面');
  72. echo $Demo6->getInfo().'<hr>';
  73. // 类中存在抽象方法,类必须为抽象类
  74. abstract class GetData
  75. {
  76. protected string $id = '0';
  77. protected string $frcn = '38950';
  78. protected string $imsi = '460001234512345';
  79. // 抽象类中,方法无法完成,但必须在子类中完成
  80. abstract public function getInfo();
  81. }
  82. // 抽象类扩展,方法可完成
  83. class GetDataSon extends GetData
  84. {
  85. public function getInfo()
  86. {
  87. return $this->id;
  88. }
  89. }
  90. $GET = new GetDataSon;
  91. echo $GET->getInfo().'<hr>';
  92. // 最终类,方法必须完成,否则会报错,无法再继续扩展子类了,
  93. final class Demo10 {
  94. public function getInfo(){
  95. }
  96. }
  97. // 接口类中两类成员:常量,方法(两者必须都是public)
  98. interface iName {
  99. public const NATION = 1;
  100. public const NAME2 = 2;
  101. public function A();
  102. public function B();
  103. public function C();
  104. }
  105. echo iName::NATION.'<hr>';
  106. // 抽象类继承接口的方法,可实现部分功能
  107. abstract class name implements iName{
  108. public function A(){
  109. return iName::NATION;
  110. }
  111. }
  112. // 工作类,继承抽象类
  113. class name2 extends name {
  114. public function B(){
  115. }
  116. public function C(){
  117. }
  118. }
  119. namespace four;
  120. const OP = 'WOCAO';
  121. echo \AAA\show2().'<hr>';
  122. echo \AAA\Index::class.'<hr>';
  123. echo \AAA\Index::show().'<hr>';
  124. namespace AAA;
  125. const KKK = '又是一个测试';
  126. function show2(){
  127. return __METHOD__;
  128. };
  129. class Index {
  130. public static function show(){
  131. return __METHOD__;
  132. }
  133. }

案例结果

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