Blogger Information
Blog 36
fans 0
comment 0
visits 28438
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
面向对象——后期静态绑定、重载与拦截器
phpcn_u202398
Original
569 people have browsed it

1、后期静态绑定

  • 静态调用的方法:self::,parent::,static::
代码示例
  1. <?php
  2. //后期静态绑定
  3. class User{
  4. public static function getName(){
  5. return $name = "李明";
  6. }
  7. public static function back(){
  8. //return self::getName();
  9. return static::getName();
  10. }
  11. }
  12. class User1 extends User{
  13. public static function getName(){
  14. //return parent::getName();
  15. return $name = "小虎";
  16. }
  17. }
  18. //客户端
  19. echo User1::getName();
  20. echo"<hr>";
  21. echo User::getName();
  22. ?>

2、属性重载/拦截器的方法

  • 拦截器方法:“拦截”发送到未定义方法和属性的消息
拦截器方法
方法 描述
__get($property) 访问未定义的属性时被调用
__set($property,$value) 给未定义的属性赋值时被调用
__isset($property) 对未定义的属性调用isset()时被调用
__unset($property) 对未定义的属性调用unset()时被调用
__call($method,$arg_array) 调用未定义的方法时被调用
代码示例
  1. <?php
  2. class User
  3. {
  4. private $name;
  5. private $age;
  6. public function __construct($name, $age)
  7. {
  8. $this->name = $name;
  9. $this->age = $age;
  10. }
  11. // 1. 属性查询拦截器
  12. public function __get($property)
  13. {
  14. $method = 'get' . ucfirst($property);
  15. // 2. 转发访问请求
  16. return method_exists($this, $method) ? $this->$method() : null;
  17. }
  18. private function getName()
  19. {
  20. return $this->name . '-->';
  21. }
  22. private function getage()
  23. {
  24. return $this->age;
  25. }
  26. // 2. 属性设置拦截器
  27. public function __set($property, $value)
  28. {
  29. $method = 'set' . ucfirst($property);
  30. // 转发访问请求
  31. return method_exists($this, $method) ? $this->$method($value) : null;
  32. }
  33. private function setName($value)
  34. {
  35. $this->name = trim($value);
  36. }
  37. private function setage($value)
  38. {
  39. if($value===null) unset($this->age) ;
  40. else $this->age = ('保密');
  41. }
  42. // 3. 属性检测拦截器
  43. public function __isset($property)
  44. {
  45. return $property === 'name' ? isset($this->name) : false;
  46. }
  47. // 4. 属性销毁拦截器
  48. public function __unset($property)
  49. {
  50. if ($property === 'age') {
  51. $method = 'set' . ucfirst($property);
  52. // 转发访问请求
  53. if (method_exists($this, $method)) return $this->$method(null) ;
  54. }
  55. }
  56. }
  57. // 客户端
  58. $user = new User('李明', 23);
  59. // 访问了一个无访问权限的类属性
  60. echo $user->name;
  61. echo $user->age;
  62. echo '<hr>';
  63. $user->name = '小花';
  64. $user->age = '34';
  65. echo $user->name;
  66. echo $user->age;
  67. unset($user->name);
  68. echo $user->name;
  69. unset($user->age);
  70. echo $user->age;
  71. ?>
  72. ?>

3、方法重载/拦截器的方法

代码示例
  1. <?php
  2. class User
  3. {
  4. // 方法拦截器
  5. public function __call($name, $arguments)
  6. {
  7. printf('方法名: %s , 参数: [%s]', __FUNCTION__ , implode(', ', $arguments));
  8. }
  9. // 静态方法拦截器
  10. public static function __callStatic($name, $arguments)
  11. {
  12. printf('静态方法名: %s , 参数: [%s]', __FUNCTION__ , implode(', ', $arguments));
  13. }
  14. }
  15. $user = new User();
  16. $user->name('方法拦截器');
  17. echo '<br>';
  18. User::name('静态方法拦截器');
  19. ?>

学习总结

本节课我们学习了后期静态绑定、重载与拦截,对学过的知识似懂非懂的感觉,看知识点、视频感觉会了,但是脱离视频自己写示例太费劲,通过后期的学习来学懂这部分知识点。

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