博客列表 >php学习第13章 静态绑定与拦截器

php学习第13章 静态绑定与拦截器

王小飞
王小飞原创
2020年05月04日 17:14:03642浏览

后期静态绑定的原理与实现

  1. <?php
  2. abstract class fulei
  3. {
  4. public static function fangfa()
  5. {
  6. return new static();
  7. return $this->yinhangka;
  8. return $this->zhanghu;
  9. }
  10. }
  11. // 实现类1
  12. class zahgnhu extends fulei
  13. {
  14. public $zhanghu = 'xiaofei';
  15. }
  16. // 实现类2
  17. class shujv extends fulei
  18. {
  19. public $yinhangka = '工商银行';
  20. }
  21. // 客户端
  22. $user = zahgnhu::fangfa();
  23. var_dump($user);
  24. echo '<hr>';
  25. $product = shujv::fangfa();
  26. var_dump($product);
  27. class fulei1
  28. {
  29. // 静态方法: 允许重写
  30. public static function index()
  31. {
  32. return '当前调用方法: ' . __METHOD__;
  33. }
  34. public static function fetch()
  35. {
  36. // static 代表调用类下面的方法 而非当前父类
  37. return static::index();
  38. }
  39. }
  40. class User extends fulei1
  41. {
  42. // 重写父类中的静态方法: index()
  43. public static function index()
  44. {
  45. return '当前调用方法: ' . __METHOD__;
  46. }
  47. }
  48. //打印结果为调用的USer 下面的index方法
  49. echo User::fetch();

属性重载/拦截器 set(), get(), isset(), unset()

  1. class lei
  2. {
  3. private $name;
  4. private $gognzi;
  5. // private $tichegn = 1;
  6. public function __construct($name, $gognzi)
  7. {
  8. $this->name = $name;
  9. $this->gognzi = $gognzi;
  10. }
  11. // 1. 属性查询拦截器
  12. public function __get($ffmcbc)
  13. {
  14. $ffmc = 'get' . ucfirst($ffmcbc);
  15. // 转发访问请求 method_exists判断有没有这个属性 $this所在的类/对象 $method属性名称 没有就返回null
  16. return method_exists($this, $ffmc) ? $this->$ffmc() : null;
  17. }
  18. private function getName()
  19. {
  20. return mb_substr($this->name, 0, 2) . '..被折叠';
  21. }
  22. private function getGognzi()
  23. {
  24. return $this->gognzi + $this->tichegn;
  25. }
  26. // 2. 属性设置拦截器 public function __set(属性名称, 属性值)
  27. public function __set($ffmcbc, $sxz)
  28. {
  29. // 方法名称保存到变量 ucfirst首字母大写
  30. $ffmc = 'set' . ucfirst($ffmcbc);
  31. // 转发访问请求 判断有没有这个属性 返回属性和值 没有返回null
  32. return method_exists($this, $ffmc) ? $this->$ffmc($sxz) : null;
  33. }
  34. private function setName($sxz)
  35. {
  36. // 设置的新值
  37. $this->name = trim($sxz);
  38. }
  39. private function setGognzi($sxz)
  40. {
  41. // 判断值是否等于空 等于空则删除值 否则输出工资
  42. if ($sxz === null) unset($this->gognzi);
  43. else $this->gognzi = trim($sxz);
  44. }
  45. // 3. 属性检测拦截器 public function __isset($属性名)
  46. public function __isset($sxm)
  47. {
  48. return $sxm === 'gognzi' ? isset($this->gognzi) : false;
  49. }
  50. // 4. 属性销毁拦截器 public function __unset($属性名)
  51. public function __unset($sxm)
  52. {
  53. if ($sxm === 'gognzi') {
  54. $sxmbl = 'set' . ucfirst($sxm);
  55. // 转发访问请求
  56. if (method_exists($this, $sxmbl)) return $this->$sxmbl(null) ;
  57. }
  58. }
  59. }
  60. // 客户端
  61. $product = new lei('王小飞', 50000);
  62. echo $product->name;
  63. echo $product->gognzi;
  64. echo '<hr>';
  65. $product->name = '李三';
  66. $product->gognzi = 10000;
  67. echo $product->name;
  68. echo $product->gognzi;
  69. echo '<hr>';
  70. echo isset($product->name) ? '存在' : '不存在';
  71. echo isset($product->gognzi) ? '存在' : '不存在';
  72. echo '<hr>';
  73. unset($product->name);
  74. echo $product->name;
  75. unset($product->gognzi);
  76. echo $product->gognzi;

// 方法拦截器call(), callStatic()

  1. class User
  2. {
  3. // 方法拦截器public function __call($方法名称, $参数值数组)
  4. public function __call($name, $arguments)
  5. {
  6. // implode 把数组拼装成字符串
  7. printf('方法名: %s , 参数: [%s]', $name, implode(', ', $arguments));
  8. }
  9. // 静态方法拦截器
  10. public static function __callStatic($name, $arguments)
  11. {
  12. printf('静态方法名: %s , 参数: [%s]', $name, implode(', ', $arguments));
  13. }
  14. }
  15. $user = new User();
  16. $user->demo('张小飞',2,3,4);
  17. echo '<br>';
  18. User::demo(6,7,8,900);

总结:越往后学基础越重要,要不然学新知识里面的旧知识都看不懂。

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