Blogger Information
Blog 52
fans 0
comment 3
visits 42455
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php学习第13章 静态绑定与拦截器
王小飞
Original
639 people have browsed it

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

  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);

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

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