dong5300 发表于 2017-3-25 10:22:53

php __call 与 __callStatic

转自:http://blog.csdn.net/fdipzone/article/details/8581125
 
php 5.3 后新增了 __call 与__callStatic 魔法方法。
__call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。
__callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。
 
__call($funcname, $arguments)
__callStatic($funcname, $arguments)

参数说明:
$funcname String 调用的方法名称。
$arguments Array 调用方法时所带的参数。
 
__call 例子
 
 view plaincopy



[*]<?php  
[*]  
[*]class Member{  
[*]  
[*]    protected $memberdata = array();  
[*]  
[*]    public function __call($func, $arguments){  
[*]        list($type, $name) = explode('_', $func);  
[*]      
[*]        if(!in_array($type, array('set','get')) || $name==''){  
[*]            return '';  
[*]        }  
[*]  
[*]        switch($type){  
[*]            case 'set':  
[*]                $this->memberdata[$name] = $arguments;  
[*]                break;  
[*]              
[*]            case 'get':  
[*]                return isset($this->memberdata[$name])? $this->memberdata[$name] : '';  
[*]                break;  
[*]              
[*]            default:  
[*]        }  
[*]  
[*]    }  
[*]  
[*]}  
[*]  
[*]  
[*]class User extends Member{  
[*]  
[*]    public function show(){  
[*]        if($this->memberdata){  
[*]            foreach($this->memberdata as $key=>$member){  
[*]                echo $key.':'.$member.'<br>';  
[*]            }  
[*]        }  
[*]    }  
[*]  
[*]}  
[*]  
[*]  
[*]class Profession extends Member{  
[*]  
[*]    public function show(){  
[*]        if($this->memberdata){  
[*]            foreach($this->memberdata as $key=>$member){  
[*]                echo $key.':'.$member.'<br>';  
[*]            }  
[*]        }  
[*]    }  
[*]  
[*]}  
[*]  
[*]$userobj = new User();  
[*]$userobj->set_name('fdipzone');  
[*]$userobj->set_age(29);  
[*]$userobj->show();  
[*]  
[*]$probj = new Profession();  
[*]$probj->set_profession('IT SERVICE');  
[*]$probj->set_price(2500);  
[*]$probj->show();  
[*]  
[*]?>  

 
__callStatic例子
 
 view plaincopy



[*]<?php  
[*]  
[*]class Member{  
[*]  
[*]    protected static $memberdata = array();  
[*]  
[*]    public static function __callStatic($func, $arguments){  
[*]  
[*]        list($type, $name) = explode('_', $func);  
[*]          
[*]        if(!in_array($type, array('set','get')) || $name==''){  
[*]            return '';  
[*]        }  
[*]  
[*]        $feature = get_called_class();  
[*]  
[*]        switch($type){  
[*]            case 'set':  
[*]                self::$memberdata[$feature][$name] = $arguments;  
[*]                break;  
[*]  
[*]            case 'get':  
[*]                return isset(self::$memberdata[$feature][$name])? self::$memberdata[$feature][$name] : '';  
[*]                break;  
[*]  
[*]            default:  
[*]        }  
[*]      
[*]    }  
[*]  
[*]}  
[*]  
[*]  
[*]class User extends Member{  
[*]  
[*]    public static function show(){  
[*]  
[*]        $feature = get_called_class();  
[*]  
[*]        if(self::$memberdata[$feature]){  
[*]            foreach(self::$memberdata[$feature] as $key=>$member){  
[*]                echo $key.':'.$member.'<br>';  
[*]            }  
[*]        }  
[*]    }  
[*]  
[*]}  
[*]  
[*]  
[*]class Profession extends Member{  
[*]  
[*]    public static function show(){  
[*]  
[*]        $feature = get_called_class();  
[*]  
[*]        if(self::$memberdata[$feature]){  
[*]            foreach(self::$memberdata[$feature] as $key=>$member){  
[*]                echo $key.':'.$member.'<br>';  
[*]            }  
[*]        }  
[*]    }  
[*]  
[*]}  
[*]  
[*]User::set_name('fdipzone');  
[*]User::set_age(29);  
[*]User::show();  
[*]  
[*]Profession::set_profession('IT SERVICE');  
[*]Profession::set_price(2500);  
[*]Profession::show();  
[*]  
[*]?>  
页: [1]
查看完整版本: php __call 与 __callStatic