魔术方法 :__callStatic( )实例详解
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( )实例详解相关推荐
- python类是实例的工厂_Python设计模式之工厂方法模式实例详解
本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...
- php表格中的caption,html中caption标签的使用方法及实例详解
html5中 标签作用是定义表格标题,这里详细介绍下标签用法.标签属性以及标签应用实例. html中 标签作用:定义表格标题标签用法: caption 元素定义表格标题. caption 标签必须紧随 ...
- java中modifier_java中关于.lang.reflect.Modifier.isInterface()方法的实例详解
这篇文章主要介绍了详解java.lang.reflect.Modifier.isInterface()方法的相关资料,这里提供实例帮助大家理解这个方法的使用,需要的朋友可以参考下 详解java.lan ...
- python怎样安装词云库_python词云库wordcloud的使用方法与实例详解
wordcloud是优秀的词云展示第三方库 一.基本使用 import jieba import wordcloud txt = open("1.txt", "r&quo ...
- JAVA计时函数的库_JAVA开发常用类库UUID、Optional、ThreadLocal、TimerTask、Base64使用方法与实例详解...
1.UUID类库 UUID 根据时间戳实现自动无重复字符串定义 // 获取UUID public static UUID randomUUID() // 根据字符串获取UUID public stat ...
- 史上最详细的RACI(责任分配矩阵)使用方法及实例详解
作为PMO和项目经理一定对于RACI责任分配矩阵不陌生,但是很少有人真正用起来,RACI是一个广泛应用于项目管理的模型,用于明确角色和责任. 在项目的不同阶段或任务中,RACI模型有助于划分和理解团队 ...
- 爬去微信小程序服务器代码,Python爬取微信小程序通用方法代码实例详解
背景介绍 最近遇到一个需求,大致就是要获取某个小程序上的数据.心想小程序本质上就是移动端加壳的浏览器,所以想到用Python去获取数据.在网上学习了一下如何实现后,记录一下我的实现过程以及所踩过的小坑 ...
- php把微信一键登录,PHP微信第三方实现一键登录及获取用户信息的方法(实例详解)...
这篇文章主要介绍了PHP版微信第三方实现一键登录及获取用户信息的方法,较为详细的分析了微信第三方登陆的相关注意事项与实现技巧,需要的朋友可以参考下 注意,要使用微信在第三方网页登录是需要"服 ...
- java测试类 main方法_Java使用agent实现main方法之前的实例详解
Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...
最新文章
- Matlab 绘制三维立体图(以地质异常体为例)
- figma下载_如何在Figma中创建逼真的3D对象
- 现代计算机网络的6个方面的应用,现代计算机网络技术应用及发展(共4384字).doc...
- 处理和引发事件的规范
- The method setCharacterEncoding(String) is undefined for the type HttpServletResponse 是什么原因?...
- Python numpy学习笔记(一)
- win11退回win10一直黑屏转圈怎么办 win11退回win10黑屏转圈的解决方法
- 1-n整数中1出现的次数
- 《推荐系统实践》算法纯享(附代码链接)(一)—— 评价指标篇
- 47-点分十进制表示法
- 求二元一次方程 的解 C语言
- 图形形状及颜色识别【Python大作业】
- 计算机与测控技术专业就业方向,测控技术与仪器专业就业前景与方向(五篇)
- ppt模板如何制作个性海报?
- Docker最全总结,DockerFile,Docker编排容器,Docker镜像,Docker-compose构建
- 深度自动编码器(Deep Auto-encoder)
- 【转】do{...}while(0)的意义和用法
- 植物大战僵尸2 服务器维护时间,植物大战僵尸2PVP商店多久更新一次
- 国际知名服装品牌网站
- 第八课——细述QQ与TIM的不同之处
热门文章
- MyBatis配置文件出现错误,已解决(The content of element type )
- ubuntu18 mysql5.6源码_Ubuntu 18.04 使用Systemd管理MySQL 5.6
- 【引用】mkswap 把一个分区格式化成为swap交换区
- GitHub 2200+星的任正非语录下架了,我们找到了一份fork版
- 直播 | “深度学习”到底是什么?这篇文章讲明白了
- AI版“大家来找茬”上线,究竟谁是真人,谁是GAN生成的假脸?
- 英伟达美女工程师:AI从业者要不要读博?要不要自己创业?
- 论PS的功力,英伟达的AI这次谁也不服
- js格式化xml并高亮显示关键字
- [转] [Elasticsearch] 数据建模 - 处理关联关系(1)