Blogger Information
Blog 36
fans 1
comment 0
visits 29761
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php后期静态绑定与拦截器
Jason
Original
731 people have browsed it

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]

总结

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

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