PHP魔术方法__get()、__set()、__call()、__invoke()的理解

1. __call 

核心思想:当调用类中不存在的方法时,就会调用__call();

例子:

<?php
class Test{
     public function __call($method,$args){
          echo $method;
          var_dump($args);
        }   
    }  
     $ob=new Test();
     $ob->hello(1,2);
?>
2.__get() 和__set()


核心思想:访问类中不存在的成员变量时就会调用__get();当在类中设置不存在的成员变量时就会调用__set()
例子:

<?php
class Test{
       public $c=0;
       public $arr=array();
       
       public function __set($x,$y){
            echo $x . "/n";
            echo $y . "/n";
            $this->arr[$x]=$y;
        }    
        public function __get($x){
            echo "The value of $x is".$this->arr[$x];

        }   
} 
$a = new Test;
$a->b = 1 ;//成员变量b不存在,所以会调用__set
$a->c  = 2;//成员变量c存在,所以无任何输出
$d=$a->b;//  成员变量b不存在,所以会调用__get     
?>
3.__invoke()


核心思想:实例化对象本身是不能被调用,但是类中如果实现 __invoke() 方法,则把实例对象当作方法调用,会自动调用到 __invoke() 方法,参数顺序相同

例子:

<?php
 
class CallableClass
{
    public function __invoke($param1, $param2)
    {
        var_dump($param1,$param2);
    }
}
 
$obj  = new CallableCalss;
$obj(123, 456);
 
var_dump(is_callable($obj));



分享至
2019-02-13 发布 ┊ 1375 人浏览 ┊ 0 人评论 ┊ 来源:原创 ┊ 收藏
返回顶部