魔术方法 :__callStatic( )实例详解

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

2. 实例:
<?php  

//创建父类:Member  
class Member{  

      //创建受保护静态属性:数组
    protected static $memberdata = array();  

    //当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法
    public static function __callStatic($func, $arguments){  

          //explode():用'_'字符串分割为数组
          //list():将数组元素转为对应的独立变量:$type,$name
        list($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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值