Blogger Information
Blog 32
fans 0
comment 0
visits 27762
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP后期静态绑定和重载
Yang_Sir
Original
617 people have browsed it

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

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();//已定义的方法
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