博客列表 >静态绑定与拦截器

静态绑定与拦截器

暝皑祯π_π
暝皑祯π_π原创
2020年05月07日 14:23:47811浏览

后期静态绑定

  1. <?php
  2. // 后期静态绑定: 又叫延迟静态绑定
  3. // 后期静态绑定工作在: 静态继承上下文的环境中
  4. class Pro
  5. {
  6. public static function ds()
  7. {
  8. return __CLASS__;
  9. // 关键字:atatic,
  10. // 定义在调用该方法时与调用类进行绑定
  11. static::ds();
  12. }
  13. }
  14. class Pro1 extends Pro
  15. {
  16. }
  17. // 客户端
  18. $a = new pro;
  19. var_dump($a);
  20. echo '<hr>';
  21. $b = new pro1;
  22. var_dump($b);
  23. echo '<hr>';

构造方法

  1. // 构造方法: __construct(), 是类的实例化过程中被自动调用, new 的时候,也叫构造器
  2. // 功能就是生成一个新对象
  3. // 构造器:__construct()
  4. class A
  5. {
  6. public $dis = 12;
  7. public $dos = 55;
  8. public function lii()
  9. {
  10. echo __CLASS__;
  11. }
  12. public function __construct($dis,$dos) //通过在构造函数括号内定义属性,传给构造方法
  13. {
  14. // 初始化新对象,添加属性并赋值
  15. $this->dis = $dis;
  16. $this->dos = $dos;
  17. // 自动执行操作
  18. $this->lii();
  19. }
  20. }
  21. // $c = new A(33,66);
  22. $c = new A(33,66);
  23. echo $c->dis; //33
  24. echo $c->dos; //66

属性拦截器

  1. // 属性拦截器:拦截类外部属性访问
  2. // 访问属性拦截器:__get()
  3. // 设置属性拦截器:__set()
  4. // 检测属性拦截器:__isset()
  5. // 删除属性拦截器:__unset()
  6. // 使用场景: 当用户访问一个不存在的或无权限访问属性/方法时, 自动调用
  7. class Abs
  8. {
  9. private $bus = '公交车';
  10. private $car = '比亚迪';
  11. //创建访问属性拦截器
  12. public function __get($num)
  13. {
  14. // 先事先约定一些方法专用于处理属性访问
  15. $k = 'get' . ucfirst($num); // 把拦截到的数据当成参数赋值给$k
  16. // 转发访问请求
  17. return method_exists($this,$k) ? $this->$k():'';//检查函数是否存在,如果存在就执行这个函数,否则打印空字符串
  18. }
  19. // 方法1
  20. private function getBus()
  21. {
  22. return $this->bus;
  23. }
  24. // 方法2
  25. private function getCar()
  26. {
  27. return $this->car;
  28. }
  29. //创建设置属性拦截器
  30. public function __set($name, $value)
  31. {
  32. // 先事先约定一些方法专用于处理属性访问
  33. $method = 'set' . ucfirst($name); // 把拦截到的数据当成参数赋值给$k
  34. // 转发访问请求
  35. return method_exists($this,$method) ? $this->$method($value) : '';//检查函数是否存在,如果存在就执行这个函数,否则打印空字符串
  36. }
  37. // 方法1
  38. private function setBus($value)
  39. {
  40. $this->bus = '中国的' . $value;
  41. }
  42. // 方法2
  43. private function setCar($value)
  44. {
  45. $this->car = '中国的' . $value;
  46. }
  47. //创建检测属性拦截器
  48. public function __isset($name)
  49. {
  50. return $name === 'bus' ? isset($this->bus) : 'false';
  51. // return $name === $this->bus ? isset($this->bus) : false;//检查属性是否存在,如果存在就检查这个属性,否则打印空字符串
  52. }
  53. // 创建属性销毁拦截器
  54. public function __unset($name)
  55. {
  56. unset($this->bus);
  57. }
  58. }
  59. $p = new Abs;
  60. echo '<hr>';
  61. echo $p->bus;
  62. echo '<hr>';
  63. echo $p->car;
  64. echo '<hr>';
  65. $p->bus = '奇瑞';
  66. $p->car = '长安';
  67. echo $p->bus;
  68. echo '<hr>';
  69. echo $p->car;
  70. echo '<hr>';
  71. var_dump(isset($p->bus));
  72. echo '<hr>';
  73. unset($p->bus);
  74. var_dump(isset($p->bus));

方法拦截器

  1. / 方法拦截器
  2. // __call(参数1 , 参数2):当工作端访问不存在或者无权限的方法时调用
  3. // __callStatic(参数1 , 参数2):当工作端访问不存在或者无权限的‘静态’方法时调用
  4. // 参数1:方法名称
  5. // 参数2:传递给当前方法的参数列表
  6. public function __call($name , $v)
  7. {
  8. return __CLASS__ . implode('- ', $v);
  9. }
  10. // 静态方法拦截器
  11. public static function __callStatic($name , $v)
  12. {
  13. return __CLASS__ . implode('- ', $v);
  14. }
  15. }
  16. echo '<hr>';
  17. echo $p->kkkk(5,6,4);
  18. echo '<hr>';
  19. echo Abs::kkkk(6,7,8,9);

总结

  • 1.后期静态绑定可以把定义的静态方法与调用它的类进行绑定,而不是定义它的类
  • 2.只有从类外部访问这个属性时,拦截器才会工作
  • 3.拦截器原理:当我们在工作端进行访问类成员时,激活拦截器,拦截器获取数据进行判断,然后通过转发访问请求转发数据到相应的函数操作后输出。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议