美文网首页
PHP魔术方法之__call与__callStatic方法

PHP魔术方法之__call与__callStatic方法

作者: babybus_hentai | 来源:发表于2016-05-31 20:46 被阅读40次
    <?php 
    
    class human{
        private function t(){
        }
    
        //魔术方法__call
        /*
        $method 获得方法名
        $arg 获得方法的参数集合
        */
        public function __call($method, $params){
            echo '你想调用我不存在的方法', $method, '方法';
            echo '还传了一个参数';
            print_r($params);
        }
    
        //魔术方法__callStatic
        public static function __callStatic($method, $params){
            echo '你想调用我不存在的', $method, '静态方法';
            echo '还传了一个参数';
            print_r($params),'';
        }
    }
    
    $li=new human();
    $li->say(1, 2, 3);
    
    /*
    __call是调用不可见(不存在或无权限)的方法时,自动调用
    $li->say(1, 2, 3);
    -----没有say()方法---->
     __call('say', array(1, 2, 3))运行
    */
    
    human::cry('痛哭', '鬼哭', '号哭');
    
    /*
    __callStatic 是调用不可见的静态方法时,自动调用.
    Human::cry('a', 'b', 'c');
    ----没有cry方法---> 
    Human::__callStatic('cry', array('a', 'b', 'c'));
    */
    
    ?>
    
    天气预报小实例
    <?php  
    
    //获得每个城市天气预报  
    class Action{  
        
        // 静态实例类
        private static $instance = null;
    
        public function tj(){  
            echo 'tj天气预报<br/>';  
        }
    
        /* 
        $method 方法名 
        $params 方法参数集合 
        */  
        public function __call($method, $params){  
            echo $method, '天气预报<br/>';  
        } 
    
        /* 
        $method 方法名 
        $params 方法参数集合 
        */  
        public static function __callStatic($method, $params){
            if(is_null(self::$instance)){
                self::$instance = new ActionStatic();
                call_user_func_array([self::$instance, $method], $params); 
            }
        } 
    }
    
    // 被另一个类调用
    class ActionStatic{
        public funtion action_static($params){
            echo $params . '天气预报';
        }     
    }
    
    $c = new Action();  
    $c->tj();  
    
    //获得城市  
    $city = 'fuzhou';  
    
    if(isset($city)){  
        //获得城市的方法,由魔术方法__call处理  
        $c->$city();  
    }
    
    // 首先去调用Action方法的action_static静态方法,
    // 结果找不到,然后会自动调用__callStatic方法
    // 再然后调用 call_user_func_array 然后调用 ActionStatic 的action_static 
    Action::action_static('福州');
    
    /* 
    结果: 
      tj天气预报 
      fuzhou天气预报 
      福州天气预报
    */  
    
    ?>  

    相关文章

      网友评论

          本文标题: PHP魔术方法之__call与__callStatic方法

          本文链接:https://www.haomeiwen.com/subject/mqxhdttx.html