魔术方法

魔术方法可以拦截用户调用没有定义或无法访问的方法或访问属性,对这些操作进行相应的处理

在开发框架中经常用到,因为不能每个调用都对应一个方法,所以要使用魔术方法统一处理,提高应用处理问题的能力

<?php
//某些情况下会自动调用的方法称为魔术方法
class Human{
    private $money=1000;
    protected $name="lisi";
    public $age=21;
    protected function tomoney(){
        echo $this->money;
    }
    public function cry(){
        echo "哇哇";
    }
    //魔术方法__get($p){}在你调用实例化对象的无法访问(未定义或没有权限)
    //的属性是会调用这个方法,参数$p为你要访问的属性
    public function __get($property){
        echo "你想得到无法访问的",$property,"属性","<br/>";
    }
    //魔术方法__set($k,$v){}在你想设置无法访问的属性时(未定义或没有权限)调用此方法,
    //参数$k为你要改变那个属性的属性名,$v是要改变成哪个值
    public function __set($key,$value){
        echo "你想修改没有权限的",$key,"的属性","<br/>";
        echo "你修改的值为",$value,"<br/>";
    }
    //__isset($property){}当使用isset()方法检测无法访问的属性时,调用这个方法来判断,isset()的返回值
    //是该魔术方法的返回值,所以并不代表不在,具体要看该魔术方法的设置
    public function __isset($property){
        echo "你想判断",$property,"是否存在","<br/>";
        return true;
    }
    //当你要销毁无法访问的属性时调用
    public function __unset($property){
        echo "你要销毁",$property,"对象","<br/>";
    }
    //当你调用无法访问的方法时调用此方法,$method为方法名,$argument为所有参数的数组
    public function __call($method,$argument){
        echo "你想调用函数",$method,"参数为","<br/>";
        print_r($argument);
        echo "<br/>";

    }
    //当你要静态调用无法访问的函数时,调用此函数,静态调用是  类名::方法名();
    public static function __callStatic($method,$argument){
        echo "你想静态调用",$method,"方法","<br/>";
        echo "参数为";
        print_r($argument);
        echo "<br/>";
    }
}
$lisi=new Human();
$key=$lisi->money;
$lisi->tomoney();
$lisi->header=1;
if(isset($lisi->leg)){
    echo "有leg属性","<br/>";
}else{
    echo "没有leg属性","<br/>";
}
unset($lisi->money);
Human::nihao(1,2,3,4);
?>

 天气预报小测试

<?php
class tianqi{
    public function __call($method,$argument){
        echo $method,"天气预报";
    }
}
$var=$_GET["method"];
$tianqi=new tianqi();
$tianqi->$var();

?>
原文地址:https://www.cnblogs.com/lzzhuany/p/4749088.html