Blogger Information
Blog 145
fans 7
comment 7
visits 164554
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP基础知识:类相关总结和延时绑定和(重载)拦截器
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
Original
779 people have browsed it

抽象类(abstract)、接口类(interface)、trait总结:

一:抽象类(abstract)

1、抽象类必须在class前面加关键abstract,且存在抽象方法(在function前面加abstract);
2、抽象类不能被实列化,只能通过子类来实现;子类实现时,必须实现父类中所有的抽象方法;
3、抽象方法中的访问权限,在子类中遵循访问权限必须大于等于父类(如果父类定义的抽象类为:protected时,子类必须时public);
4、抽象类中的抽象方法不能设置成私有的:private;

二:接口(interface)

1、接口的关键字:interface;也无法实列化,
2、接口时纯粹的模板,只定义功能而不包含实现方法
3、接口中的成员的访问权限都是:public;
4、接口中的成员:方法和常量(接口中几乎很少使用);
5、接口实现:可以通过抽象类实现部分方法,但在继承的工作类中必须全部实现;
6、通过implements来继承接口;可以多继承以逗号分隔;

三、trait

1、trait是一种特殊类的,无法实例化,只能通过宿主实现;像一个函数(方法)集合;
2、通过use来嵌入宿主;trait之间可以调用;也可以同时调用多个trait;use A,B;
3、不同trait中的同名方法可以通过替代insteadOfas别名来区分使用;
4、trait中的方法可以通过as别名的方法来改变方法的访问权限;

四、三者之间的区别:

1、abstractinterfacetrait三者都不能被实例化;
2、抽象类单继承,接口可以多继承,trait可以工作中随时使用;
3、方法实现遵循的优先级:父类<trait<本身;
4、接口中全部为抽象方法;一般不适合写在接口和抽象类中方法和属性一般都写在trait;

代码练习

1、代码

  1. <?php
  2. namespace Test;
  3. class A
  4. {
  5. public static function getClass(){
  6. // 通过关键字static实现静态延迟绑定;static与调用类绑定
  7. return static::class;
  8. }
  9. public static function getC(){
  10. // self代表当前类,与定义它的当前类绑定
  11. return self::class;
  12. }
  13. }
  14. class B extends A
  15. {
  16. }
  17. echo B::getC();
  18. echo '<br>';
  19. echo A::getC();
  20. echo '<hr>';
  21. echo "静态延迟绑定",'<br>';
  22. echo B::getClass();
  23. echo '<br>';
  24. echo A::getClass();
  25. namespace Test1;
  26. class A
  27. {
  28. public static function getClass(){
  29. // 通过关键字static实现静态延迟绑定;static与调用类绑定
  30. return '当前的调用的是'.__METHOD__;
  31. }
  32. public static function getC(){
  33. // self代表当前类,与定义它的当前类绑定
  34. return static::getClass();
  35. }
  36. }
  37. class B extends A
  38. {
  39. public static function getClass(){
  40. // 通过关键字static实现静态延迟绑定;static与调用类绑定
  41. return '重写后,当前的调用的是'.__METHOD__;
  42. }
  43. }
  44. echo '<hr>';
  45. echo "静态方法重写",'<br>';
  46. echo B::getC();
  47. echo '<br>';
  48. echo A::getC();
  49. echo '<hr>';
  50. class Php
  51. {
  52. public $name;
  53. protected $city;
  54. private $age=30;
  55. // private $sex;
  56. public function __construct($name,$city){
  57. $this->name=$name;
  58. $this->city=$city;
  59. }
  60. public function write(){
  61. return $this->name."在".$this->city;
  62. }
  63. // 访问属性属性查询拦截器
  64. public function __get($name)
  65. {
  66. return $this->$name??'没有'.$name.'属性';
  67. }
  68. public function __set($name, $value)
  69. {
  70. return $this->$name=$value;
  71. }
  72. public function __isset($protect)
  73. {
  74. return (isset($this->$protect)) ? true : false;
  75. }
  76. public function __unset($protect)
  77. {
  78. return (isset($this->$protect)) ? $this->$protect=null : '无此值';
  79. }
  80. public function __call($name, $arguments)
  81. {
  82. printf('方法名:%s,参数有:%s',$name,implode(',',$arguments));
  83. }
  84. public function __callStatic($name, $arguments)
  85. {
  86. printf('方法名:%s,参数有:%s',$name,implode(',',$arguments));
  87. }
  88. }
  89. echo (new Php('ldy','郑州'))->write();
  90. echo '<br>',"<h3>访问属性拦截器:</h3>",'<br>';
  91. echo (new Php('ldy','河南'))->age;
  92. echo '<br>';
  93. echo (new Php('ldy','河南'))->a;
  94. echo '<br>',"<h3>设置属性拦截器:</h3>",'<br>';
  95. $obj=new Php('ldy','ly');
  96. $obj->city='洛阳';
  97. echo $obj->write();
  98. echo '<h3>属性检测</h3>','<hr>';
  99. echo isset($obj->age)? '有此值':'无此值';
  100. echo '^^^^';
  101. echo isset($obj->aggggg)? '有此值':'无此值';
  102. echo '<h3>属性销毁</h3><hr>';
  103. echo $obj->age,'<br>';
  104. unset($obj->age);
  105. echo $obj->age;
  106. echo "<hr><h3>方法拦截器</h3>";
  107. echo $obj->get(1,2,3);
  108. echo "<hr><h3>静态方法拦截器</h3>";
  109. echo $obj::get(1,2,3);

2、演示结果

总结

1、静态方法调用:self::,parent::,static::; 其中只有static::与调用类绑定;
2、静态方法调用时;如果不static关键字静态绑定的,是子类重写静态方法的是无效的;
3、构造器:__construct();析构器:__destruct();
4、属性拦截器:

  1. * __get( $property ) 访问未定义的属性时候被调用
  2. * __set( $property, $value) 给未定义的属性赋值时被调用
  3. * __isset( $property ) 给未定义的属性调用isset()时候被调用
  4. * __unset( $property ) 给未定义的属性调用unset()的时候被调用

5、方法拦截器:

  1. * __call( $method, $arg_array ) 调用未定义的方法时候被调用
  2. * __callStatic( $method, $arg_array ) 调用未定义的静态方法时候被调用
Correcting teacher:天蓬老师天蓬老师

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