php提供了内置拦截器,也称为“魔术方法”,它可以拦截发送到未定义的方法或属性的消息,并作出响应,注意,魔术方法通常是以两个下划线“__"开始
__set()和_get()方法:
__set()方法在试图给未定义的属性赋值时调用,或者在类外部修改被private修饰的类属性时调用。__get()方法是当类外部访问被private或者protected修饰的属性时调用。学过java的同学相信看一眼就懂了,这就相当于javabean中的set和get方法,用于外部实例化的类访问和修改被private修饰的属性。
其实php中也是很好理解的,你将一个属性修饰为private,就代表类外部的实例是无法访问和修改的,但是这样就变得很局限,因为在实际场景中,我们都需要随时能获取和修改属性值,于是提供了__set()和__get()方法。
__set($key,$value)方法需要传入两个参数(键值):属性名和属性值,$key代表属性名,$value代表变更后的属性值。
__get($key)方法只需要传入一个参数:属性名。
header("Content-type:text/html;charset=gbk");
class magic{
private $name;
private $age = '22';
function __set($key,$value){
echo "执行了_set()方法";
$this->$key = $value;
}
function __get($key){
echo "执行了__get()方法";
echo $this->$key;
}
}
$obj = new magic();
echo $obj->weight = '30kg';//访问不存在的weight属性会被_set()方法拦截
echo '
';
$obj->name = 'kshon';//在类外部修改private修饰的属性会调用_set()方法
echo $obj->sex; //访问不存在的属性时会报错
echo $obj->name; //访问被private修饰的属性
运行结果:
__isset()和__unset()方法
__isset()和__unset()方法都是在类外部对未定义的属性或者非公有属性(private,protected)使用isset()和unset()方法进行操作时调用。
__isset()方法其实就是判断非公有属性(private,protected)在类中是否存在,但是检测不到public修饰的公有属性
__unset()也是检查非公有属性是否存在,但是如果存在,执行unset()方法会将这个属性销毁,释放该属性的内存空间,下次访问时就不存在了,会返回NULL
header("Content-type:text/html;charset=gbk");
class magic{
private $name = 'kshon';
protected $age = '22';
public $weight = '30kg';
function __isset($key){
if(property_exists('magic',$key)){
echo "属性".$key."存在
";
}else{
echo "属性".$key."不存在
";
}
}
function __unset($key){
if(property_exists('magic',$key)){
unset($this->$key);
echo "属性".$key."存在
";
}else{
echo "属性".$key."不存在
";
}
}
}
$obj = new magic();
isset($obj->name); //被private修饰的属性
isset($obj->age); //被protected修饰的属性
isset($obj->weight); //被public修饰的属性,不会调用
isset($obj->hobby); //不存在的属性
echo "
";
unset($obj->name); //被private修饰的属性
unset($obj->age); //被protected修饰的属性
echo 'weight='.$obj->weight; //使用unset前的属性还存在
unset($obj->weight); //被public修饰的属性,不会调用
echo $obj->weight; //使用unset后的属性被销毁
unset($obj->hobby); //不存在的属性
执行结果:
其中property_exists($class,$key)方法是判断$class这个类中是否存在$key这个属性
__call()和__toString()方法:
__call()是在调用类中不存在的方法时调用,它有两个参数,即方法名和对应的参数,参数以索引数组的形式存在。
__toString()是使用echo和print打印对象时调用的方法,会将对象转换为字符串。
header("Content-type:text/html;charset=gbk");
class magic{
function __call($func,$param){
echo "$func方法不存在";
var_dump($param);
}
function __toString(){
return "这个对象为magic";
}
}
$obj = new magic();
$obj->login('参数1','参数2','参数3'); //调用不存的方法login
echo "
";
echo $obj; //打印magic对象
执行结果:
领取专属 10元无门槛券
私享最新 技术干货