博客列表 >PHP后期静态绑定和重载

PHP后期静态绑定和重载

Yang_Sir
Yang_Sir原创
2020年05月05日 15:11:04616浏览

使用后期静态绑定可以解决继承中方法的调用问题。
属性和方法的重载,可以使程序更加健壮,实现一些复杂的访问控制

1.方法调用的后期静态绑定

  • 使用场景:父类方法中调用了另一个方法,而另一个方法在子类中重写了,子类在调用时需要调用自己重写的方法
  • 方法:使用static::关键字静态绑定当前调用的类
  1. <?php
  2. //后期静态绑定
  3. class demo1
  4. {
  5. //为每个参数两端加上*号
  6. public static function myStr(array $arr){
  7. return array_map(function($item){return "*".$item."*";},$arr);
  8. }
  9. public static function arr(array $arr){
  10. //去掉两端空白
  11. $arr = array_map(function($item){return trim($item);},$arr);
  12. //static静态调用myStr方法
  13. return static::myStr($arr);
  14. //self调用myStr方法
  15. //return self::myStr($arr);
  16. }
  17. }
  18. class demo2 extends demo1
  19. {
  20. //重写myStr方法,为每个参数两端加上`号
  21. public static function myStr(array $arr){
  22. return array_map(function($item){return "`".$item."`";},$arr);
  23. }
  24. }
  25. //父类demo1中使用self调用时,调用的是父类中的myStr方法
  26. print_r(demo2::arr([' 343 ',' sdgs','dsgd']));
  27. //输出:Array ( [0] => *343* [1] => *sdgs* [2] => *dsgd* )
  28. //父类demo1中使用static调用时,调用的是子类中重写的myStr方法
  29. print_r(demo2::arr([' 343 ',' sdgs','dsgd']));
  30. //输出:Array ( [0] => `343` [1] => `sdgs` [2] => `dsgd` )

2.重载/拦截处理

  • 对外部访问类属性和方法进行拦截处理

2.1 属性的重载

  • 在外部查询类的属性值,设置属性值以及检测属性和销毁属性时,使用魔术方法__get()__set()__isset()__unset()进行拦截处理
  1. <?php
  2. //属性重载/拦截处理
  3. class demo3
  4. {
  5. public static $cardNo = '40124934052856029';
  6. private static $cardName = 'jack';
  7. public static $cardDate = '135145009433';
  8. //查询属性时进行处理
  9. public function __get($name){
  10. switch($name){
  11. case 'cardName':return self::$cardName;
  12. case 'cardDate':return self::$cardDate;
  13. case 'cardNo':return substr(self::$cardNo,0,6).'****'.substr(self::$cardNo,-4,4);
  14. }
  15. }
  16. //设置属性值时处理
  17. public function __set($name,$val){
  18. if($name == 'cardName') self::$cardName = trim($val) ;
  19. if($name == 'cardNo'){
  20. self::$cardNo = is_numeric($val)?$val:'0';
  21. }
  22. }
  23. public function __isset($name)
  24. {
  25. return ($name==='cardNo'||$name==='cardName')?1:0;
  26. }
  27. public function __unset($name)
  28. {
  29. if($name==='cardDate'){self::$cardDate='111fhd';}
  30. }
  31. }
  32. $card = new demo3;
  33. //访问拦截处理
  34. echo $card->cardNo,'<br>';//401249****6029
  35. //设置拦截处理
  36. $card->cardNo = 'hd00300';
  37. echo $card->cardNo,'<br>';//0****0
  38. //属性检测拦截处理
  39. echo isset($card->cardDate)?'在':'不在','<br>';//不在
  40. echo isset($card->cardName)?'在':'不在','<br>';//在
  41. //属性销毁拦截处理
  42. echo $card->cardDate,'<br>';//135145009433
  43. unset($card->cardDate);
  44. echo $card->cardDate;//111fhd

2.2 方法重载

  • 调用不存在的方法时,通过__call__callstatic进行处理
  • __call:普通方法、
  • __callstatic:静态方法
  1. <?php
  2. //方法重载/拦截处理
  3. //调用一个不存在的方法时自动调用
  4. class demo4
  5. {
  6. public function index(){
  7. echo '已定义的方法';
  8. }
  9. public function __call($name,$arg){
  10. echo '方法'.$name .'不存在';
  11. }
  12. public static function __callStatic($name, $arguments)
  13. {
  14. echo '静态方法'.$name .'不存在';
  15. }
  16. }
  17. demo4::login();//静态方法login不存在
  18. $obj = new demo4;
  19. $obj->login();//方法login不存在
  20. $obj->index();//已定义的方法
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议