php __call 与 __callStatic对比

来源:互联网 发布:女命七杀格 知乎 编辑:程序博客网 时间:2024/06/05 17:19

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

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

__call($funcname, $arguments)__callStatic($funcname, $arguments)

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

__call 例子

<?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[0];                  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例子

<?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[0];                  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();  ?>  
原创粉丝点击