2019独角兽企业重金招聘Python工程师标准>>>

1. 功能:当调用的静态方法不存在或权限不足时自动触发该方法。

2. 实例:

<?php  //创建父类:Member
class Member{  //创建受保护静态属性:数组protected static $memberdata = array();  //当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法public static function __callStatic($func, $arguments){  //explode():用'_'字符串分割为数组//list():将数组元素转为对应的独立变量:$type,$namelist($type, $name) = explode('_', $func);  //如何$type字符串不在数组'set'和'get'中任何一个//或者$name为空的话,则调用的静态方法名称不正确,直接返回'空';  if(!in_array($type, array('set','get')) || $name==''){  return '';  }  //获取调用当前方法的类名//即:当前方法静态绑定的类名: 如 User$feature = get_called_class();  //判断$type值switch($type){ //如果$type = 'set',则是给属性$memeberdata赋值 case 'set'://将当前方法的参数数组的值$arguments[0]//赋给属性 $memberdata[$feature][$name]:注意是二维数组//当前方法只有一个值:$arguments[0]self::$memberdata[$feature][$name] = $arguments[0];  break;  //如果$type = 'get',则是获取属性$memeberdata的值 case 'get': //如果 self::$memberdata[$feature][$name]存在则返回该值,否则返回:空return isset(self::$memberdata[$feature][$name])? self::$memberdata[$feature][$name] : '';  break;    default:  }        }
}  //创建子类:User,继承自:Member类
class User extends Member{  //定义公共静态方法:show(),用来输出数据public static function show(){  //获取调用当前方法的类名,如:User$feature = get_called_class();  //如果self::$memberdata[$feature]属性存在if(self::$memberdata[$feature]){ //输出与当前类所对应的$memberdata[$feature]属性值 foreach(self::$memberdata[$feature] as $key=>$member){  echo $key.':'.$member.'<br>';  }  }  }
}  //创建子类:Profession,继承自:Member类
class Profession extends Member{  //定义公共静态方法:show(),用来输出数据public static function show(){  //获取调用当前方法的类名,如:Profession$feature = get_called_class();  //如果self::$memberdata[$feature]属性存在if(self::$memberdata[$feature]){  //输出与当前类所对应的$memberdata[$feature]属性值 foreach(self::$memberdata[$feature] as $key=>$member){  echo $key.':'.$member.'<br>';  }  }  }
}  //静态调用set_name(),set_age()
//当前类User和父类中都没有set_name静态方法,于是自动触发父类__callStatic()方法
//父类Member中的__callStatic($func,$arguments)是系统魔术方法
//在__callStatic方法中,方法名set_name转换为变量$type和$name
//并根据$type,完成属性的动态赋值或读取操作
//set_name(),set_age()分别完成了对$memberdata[$feature]属性的动态赋值操作
User::set_name('ThinkPHP');
User::set_age(10);
User::show();  //静态调用set_profession(),set_price()
//当前类User和父类中都没有set_name静态方法,于是自动触发父类__callStatic()方法
//父类Member中的__callStatic($func,$arguments)是系统魔术方法
//在__callStatic方法中,方法名set_name转换为变量$type和$name
//并根据$type,完成属性的动态赋值或读取操作
//set_name(),set_age()分别完成了对$memberdata[$feature]属性的动态赋值操作
Profession::set_lession('模型');
Profession::set_teacher('理达课堂');
Profession::show();    

转载于:https://my.oschina.net/zhiqiangwang/blog/806091

魔术方法 :__callStatic( )实例详解相关推荐

  1. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  2. php表格中的caption,html中caption标签的使用方法及实例详解

    html5中 标签作用是定义表格标题,这里详细介绍下标签用法.标签属性以及标签应用实例. html中 标签作用:定义表格标题标签用法: caption 元素定义表格标题. caption 标签必须紧随 ...

  3. java中modifier_java中关于.lang.reflect.Modifier.isInterface()方法的实例详解

    这篇文章主要介绍了详解java.lang.reflect.Modifier.isInterface()方法的相关资料,这里提供实例帮助大家理解这个方法的使用,需要的朋友可以参考下 详解java.lan ...

  4. python怎样安装词云库_python词云库wordcloud的使用方法与实例详解

    wordcloud是优秀的词云展示第三方库 一.基本使用 import jieba import wordcloud txt = open("1.txt", "r&quo ...

  5. JAVA计时函数的库_JAVA开发常用类库UUID、Optional、ThreadLocal、TimerTask、Base64使用方法与实例详解...

    1.UUID类库 UUID 根据时间戳实现自动无重复字符串定义 // 获取UUID public static UUID randomUUID() // 根据字符串获取UUID public stat ...

  6. 史上最详细的RACI(责任分配矩阵)使用方法及实例详解

    作为PMO和项目经理一定对于RACI责任分配矩阵不陌生,但是很少有人真正用起来,RACI是一个广泛应用于项目管理的模型,用于明确角色和责任. 在项目的不同阶段或任务中,RACI模型有助于划分和理解团队 ...

  7. 爬去微信小程序服务器代码,Python爬取微信小程序通用方法代码实例详解

    背景介绍 最近遇到一个需求,大致就是要获取某个小程序上的数据.心想小程序本质上就是移动端加壳的浏览器,所以想到用Python去获取数据.在网上学习了一下如何实现后,记录一下我的实现过程以及所踩过的小坑 ...

  8. php把微信一键登录,PHP微信第三方实现一键登录及获取用户信息的方法(实例详解)...

    这篇文章主要介绍了PHP版微信第三方实现一键登录及获取用户信息的方法,较为详细的分析了微信第三方登陆的相关注意事项与实现技巧,需要的朋友可以参考下 注意,要使用微信在第三方网页登录是需要"服 ...

  9. java测试类 main方法_Java使用agent实现main方法之前的实例详解

    Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...

最新文章

  1. Matlab 绘制三维立体图(以地质异常体为例)
  2. figma下载_如何在Figma中创建逼真的3D对象
  3. 现代计算机网络的6个方面的应用,现代计算机网络技术应用及发展(共4384字).doc...
  4. 处理和引发事件的规范
  5. The method setCharacterEncoding(String) is undefined for the type HttpServletResponse 是什么原因?...
  6. Python numpy学习笔记(一)
  7. win11退回win10一直黑屏转圈怎么办 win11退回win10黑屏转圈的解决方法
  8. 1-n整数中1出现的次数
  9. 《推荐系统实践》算法纯享(附代码链接)(一)—— 评价指标篇
  10. 47-点分十进制表示法
  11. 求二元一次方程 的解 C语言
  12. 图形形状及颜色识别【Python大作业】
  13. 计算机与测控技术专业就业方向,测控技术与仪器专业就业前景与方向(五篇)
  14. ppt模板如何制作个性海报?
  15. Docker最全总结,DockerFile,Docker编排容器,Docker镜像,Docker-compose构建
  16. 深度自动编码器(Deep Auto-encoder)
  17. 【转】do{...}while(0)的意义和用法
  18. 植物大战僵尸2 服务器维护时间,植物大战僵尸2PVP商店多久更新一次
  19. 国际知名服装品牌网站
  20. 第八课——细述QQ与TIM的不同之处

热门文章

  1. MyBatis配置文件出现错误,已解决(The content of element type )
  2. ubuntu18 mysql5.6源码_Ubuntu 18.04 使用Systemd管理MySQL 5.6
  3. 【引用】mkswap 把一个分区格式化成为swap交换区
  4. GitHub 2200+星的任正非语录下架了,我们找到了一份fork版
  5. 直播 | “深度学习”到底是什么?这篇文章讲明白了
  6. AI版“大家来找茬”上线,究竟谁是真人,谁是GAN生成的假脸?
  7. 英伟达美女工程师:AI从业者要不要读博?要不要自己创业?
  8. 论PS的功力,英伟达的AI这次谁也不服
  9. js格式化xml并高亮显示关键字
  10. [转] [Elasticsearch] 数据建模 - 处理关联关系(1)