php __call 与 __callStatic

来源:互联网 发布:古典音乐家 知乎 编辑:程序博客网 时间:2024/05/16 18:38

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

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

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


__call($funcname, $arguments)

__callStatic($funcname, $arguments)


参数说明:

$funcname String 调用的方法名称。

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


__call 例子

[php] view plaincopy
  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($typearray('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例子

[php] view plaincopy
  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($typearray('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[$featureas $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[$featureas $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. ?>  


本文转自:http://blog.csdn.net/fdipzone/article/details/8581125


0 0
原创粉丝点击