Blogger Information
Blog 28
fans 0
comment 0
visits 21924
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
静态绑定与拦截器
暝皑祯π_π
Original
812 people have browsed it

后期静态绑定

  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.拦截器原理:当我们在工作端进行访问类成员时,激活拦截器,拦截器获取数据进行判断,然后通过转发访问请求转发数据到相应的函数操作后输出。
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