魔术方法可以拦截用户调用没有定义或无法访问的方法或访问属性,对这些操作进行相应的处理
在开发框架中经常用到,因为不能每个调用都对应一个方法,所以要使用魔术方法统一处理,提高应用处理问题的能力
<?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(); ?>