博客列表 >PHP基础知识:类相关总结和延时绑定和(重载)拦截器

PHP基础知识:类相关总结和延时绑定和(重载)拦截器

李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰原创
2020年05月07日 10:02:36784浏览

抽象类(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 ) 调用未定义的静态方法时候被调用
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议