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

php后期静态绑定与拦截器

Jason
Jason原创
2020年05月05日 22:45:32724浏览

php后期静态绑定与拦截器

后期静态绑定

应用场景:在继承范围内引用静态调用的类

原理

当进行静态方法调用时,该类名就是明确指定的那个(通常在::运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。

实例:

  1. class A {
  2. public static function who(){
  3. echo __CLASS__;
  4. }
  5. public static function test(){
  6. // self::who()
  7. // 如果是用self的话,就会调用父类的方法
  8. static::who();
  9. }
  10. }
  11. class B extends A {
  12. public static function who(){
  13. echo __CLASS__;
  14. }
  15. }
  16. B::test();

输出:
B

通过结果我们可以看到,是调用B类里面的方法,这都是因为采用了static后期静态绑定,可以将类的的绑定延迟。

属性拦截器与方法拦截器

属性拦截器

当用户访问一个不存在或无权限的属性时,拦截器会拦截下来,进行处理。

序列 名称 作用
1 _set() 属性设置拦截器
2 _get() 属性查询拦截器
3 __isset() 属性检测拦截器
4 _unset() 属性销毁拦截器

示例:

  1. class Fruit
  2. {
  3. private $name;
  4. private $price;
  5. private $taxRate = 0.8;
  6. public function __construct($name,$price)
  7. {
  8. $this->name = $name;
  9. $this->price = $price;
  10. }
  11. // 拦截器
  12. // 注意__get名称
  13. public function __get($property)
  14. {
  15. // return $this->$property;
  16. // return $property === 'name' ? $this->name : '无权访问';
  17. // 拦截转发器
  18. $method = 'get' . ucfirst($property);
  19. return method_exists($this,$method) ? $this-> $method() : null;
  20. }
  21. public function getName()
  22. {
  23. // substr字符串截断
  24. return mb_substr($this->name,0,10).'...';
  25. }
  26. public function getPrice()
  27. {
  28. return $this->price + $this * $this->taxRate;
  29. }
  30. // 2.属性设置拦截器
  31. public function __set($property, $value)
  32. {
  33. $method = 'set'. ucfirst($property);
  34. // 转发访问请求
  35. return method_exists($this,$method) ? $this->$method($value):null;
  36. }
  37. private function setName($value)
  38. {
  39. $this->name = trim($value);
  40. }
  41. private function setPrice($value)
  42. {
  43. if($value === null)unset($this->price);
  44. else $this->price = $value * (1-$this->taxRate);
  45. }
  46. // 3.属性检测拦截器
  47. public function __isset($property)
  48. {
  49. return $property == 'name' ? isset($this->name):false;
  50. }
  51. // 属性拦截器
  52. public function __unset($property)
  53. {
  54. return $property == 'price' ? isset($this->price):false;
  55. }
  56. }
  57. $product = new Fruit('苹果',12);
  58. echo $product->name;
  59. echo $product->price;
  60. echo '<hr>';
  61. $product->name = '亿辆 车 发的';
  62. $product->price = 20000;
  63. echo $product->name;
  64. echo $product->price;
  65. echo '<hr>';
  66. echo isset($product->name) ? '存在' : '不存在';
  67. echo isset($product->price) ? '存在' : '不存在';
  68. echo '<hr>';
  69. unset($product->name);
  70. echo $product->price;

输出

  1. 苹果...12.8
  2. 亿辆 发的...4000.8
  3. 存在不存在
  4. 4000.8

通过属性拦截器我们可以看到,当用户对一些敏感属性进行设置,查询,销毁时,我们可以拦截下来,进行处理。

方法拦截器

  • 方法拦截器比属性拦截器简单一点,分为两种
  • 一种是方法拦截器,就是方法不带static
  • 一种是静态方法拦截器,就是方法带static
  • 使用场景:当用户调用一个不存在或者没有权限访问的方法或静态方法时,会拦截下来进行处理

示例:

  1. class User
  2. {
  3. // 方法拦截器
  4. public static function __call($name, $arguments)
  5. {
  6. printf('方法名:%s,参数:[%s]',$name,implode(',',$arguments));
  7. }
  8. // 静态方法拦截器
  9. public static function __callStatic($name, $arguments)
  10. {
  11. printf('静态方法名:%s,参数:[%s]',$name,implode(',',$arguments));
  12. }
  13. }
  14. $user = new User();
  15. $user -> demo(1,2,3,4);
  16. User::demo(5,234,4);

输出:

  1. 方法名:demo,参数:[1,2,3,4]
  2. 静态方法名:demo,参数:[5,234,4]

总结

今天的学习后期静态绑定与拦截器,后期静态绑定可以理解为,将方法的类名进行后期绑定,就可以绑定到继承的类当中。拦截器可以对用户的一些非法设置进行处理,防止用户篡改数据,带来不必要的麻烦。在项目当中一定很有用。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议