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();
- ?>