博客列表 >面向对象——后期静态绑定、重载与拦截器

面向对象——后期静态绑定、重载与拦截器

phpcn_u202398
phpcn_u202398原创
2020年05月04日 17:49:29564浏览

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. ?>

学习总结

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

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