Blogger Information
Blog 25
fans 1
comment 0
visits 12894
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类与对象以及接口和命名空间
xueblog9的进阶之旅
Original
634 people have browsed it

类与对象

  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. }

案例结果

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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!