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