php __call 与 __callStatic

php __call 与 __callStatic

 

php 5.3 后新增了 __call 与__callStatic 魔法方法。

__call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。

__callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。


__call($funcname, $arguments)

__callStatic($funcname, $arguments)


参数说明:

$funcname String 调用的方法名称。

$arguments Array 调用方法时所带的参数。


__call 例子

  1. <?php  
  2.   
  3. class Member{  
  4.   
  5.     protected $memberdata = array();  
  6.   
  7.     public function __call($func, $arguments){  
  8.         list($type, $name) = explode('_', $func);  
  9.       
  10.         if(!in_array($type, array('set','get')) || $name==''){  
  11.             return '';  
  12.         }  
  13.   
  14.         switch($type){  
  15.             case 'set':  
  16.                 $this->memberdata[$name] = $arguments[0];  
  17.                 break;  
  18.               
  19.             case 'get':  
  20.                 return isset($this->memberdata[$name])? $this->memberdata[$name] : '';  
  21.                 break;  
  22.               
  23.             default:  
  24.         }  
  25.   
  26.     }  
  27.   
  28. }  
  29.   
  30.   
  31. class User extends Member{  
  32.   
  33.     public function show(){  
  34.         if($this->memberdata){  
  35.             foreach($this->memberdata as $key=>$member){  
  36.                 echo $key.':'.$member.'<br>';  
  37.             }  
  38.         }  
  39.     }  
  40.   
  41. }  
  42.   
  43.   
  44. class Profession extends Member{  
  45.   
  46.     public function show(){  
  47.         if($this->memberdata){  
  48.             foreach($this->memberdata as $key=>$member){  
  49.                 echo $key.':'.$member.'<br>';  
  50.             }  
  51.         }  
  52.     }  
  53.   
  54. }  
  55.   
  56. $userobj = new User();  
  57. $userobj->set_name('fdipzone');  
  58. $userobj->set_age(29);  
  59. $userobj->show();  
  60.   
  61. $probj = new Profession();  
  62. $probj->set_profession('IT SERVICE');  
  63. $probj->set_price(2500);  
  64. $probj->show();  
  65.   
  66. ?>  

__callStatic例子

    1. <?php  
    2.   
    3. class Member{  
    4.   
    5.     protected static $memberdata = array();  
    6.   
    7.     public static function __callStatic($func, $arguments){  
    8.   
    9.         list($type, $name) = explode('_', $func);  
    10.           
    11.         if(!in_array($type, array('set','get')) || $name==''){  
    12.             return '';  
    13.         }  
    14.   
    15.         $feature = get_called_class();  
    16.   
    17.         switch($type){  
    18.             case 'set':  
    19.                 self::$memberdata[$feature][$name] = $arguments[0];  
    20.                 break;  
    21.   
    22.             case 'get':  
    23.                 return isset(self::$memberdata[$feature][$name])? self::$memberdata[$feature][$name] : '';  
    24.                 break;  
    25.   
    26.             default:  
    27.         }  
    28.       
    29.     }  
    30.   
    31. }  
    32.   
    33.   
    34. class User extends Member{  
    35.   
    36.     public static function show(){  
    37.   
    38.         $feature = get_called_class();  
    39.   
    40.         if(self::$memberdata[$feature]){  
    41.             foreach(self::$memberdata[$feature] as $key=>$member){  
    42.                 echo $key.':'.$member.'<br>';  
    43.             }  
    44.         }  
    45.     }  
    46.   
    47. }  
    48.   
    49.   
    50. class Profession extends Member{  
    51.   
    52.     public static function show(){  
    53.   
    54.         $feature = get_called_class();  
    55.   
    56.         if(self::$memberdata[$feature]){  
    57.             foreach(self::$memberdata[$feature] as $key=>$member){  
    58.                 echo $key.':'.$member.'<br>';  
    59.             }  
    60.         }  
    61.     }  
    62.   
    63. }  
    64.   
    65. User::set_name('fdipzone');  
    66. User::set_age(29);  
    67. User::show();  
    68.   
    69. Profession::set_profession('IT SERVICE');  
    70. Profession::set_price(2500);  
    71. Profession::show();  
    72.   
    73. ?> 

posted on 2014-09-20 11:38  山冈龙  阅读(357)  评论(0编辑  收藏  举报

导航