解析魔术方法之__set,__get,__isset,__unset

简单来说,这4个魔术方法的意义在于强调控制权:

对于不可见的属性(不存在或者protected/private)进行上述四种操作前,如果定义上述4种魔术变量,即会预先执行.

<?php
class one{
    public $name='rainn';
    protect $car='bmw';
    private $age=24;
}
$man=new one();
$man->name='wang';

$man->height='188cm';
$man->age=21;
?>

set的过程如$man->name='wang';$man->age=21;$man->height='188cm';

如上,可见属性为name,所以name的属性是可以被set的,而age属性不可见(protected),height属性不存在,因为没有设置__set方法而可以设置,所以如果执行这段代码,会设置height成功而不会设置age成功.

当class中未声明 public function __set时,默认无法set不可见(protected/private)属性,而可以set不存在属性.

如果想要在外部set一个不可见属性时,则需要如下方式写入class one

class one{
  public .....
  protected ...
  private ....
  public function __set($name,$value){
       $this->$name=$value;
  }
}

如此的话,再次set已存在不可见属性时,就会调用class内部方法,从而可以忽视protected或者private权限.

如果想禁止外部set不存在属性,则只需要在class内部声明一个空的public function __set($a,$b){},即可以禁止外部添加不存在属性.

同理,__get($a)为外部查看属性时预先运行的方法,当没有声明__get()时,外部查看一个不存在属性时,会提示该属性不存在,而查看不可见属性时则提示属性不可访问受保护属性,所以如果想在外部访问不可见属性时,只需加入如下代码

class one{
public ....;
protected ...
private ....
public function __get($a){
 return $this->$a;
}
}

__isset,则是在外部isset不可见或不存在属性时,预运行该方法,当没有设置该方法或者设置为空时,外部isset不可见属性或者不存在属性都将返回false;

在此要强调一个控制权的问题;

当没有声明__isset或者声明一个空__isset时,外部的返回值为false,通俗的来看,可是说是coder没有给isseter权限去查询而告诉他不存在这个属性(false)(假设类声明者coder与类外查询者inseter)在两个环境下,那么coder在class内部设置__isset的内容即是coder想要告诉的isseter的内容,如果在__iseet()中return true,则代表无论查询者查询什么,都会显示ture,无论他查询的这个属性是否真的存在.

class one{
 protected $name='a';
 public function __isset(){
return ture;
}
}
$jim=new one();
var_dump($jim->name);
var_dump($jin->age);

  如以上代码,name存在查询是返回ture,而age实际不存在,也会返回true,与实际不相符,却给你表明了权限问题呢,就是,coder说是真就是真,不是真也是真.

如果你想当一个诚实的coder,那么你可以进行如下操作

class one{
....
public function __isset($a){
return isset($this->$a);
}
}

  如此就可以进行正确的查询;

__unset的原理也差不多,当不设置__unset时,可以unset掉存在的可见属性,而不可见属性则会提示不能销毁被保护属性,如果你想要unset掉一个保护属性的话,则需要加入如下代码

class one{
....
public function __unset($a){
unset($this->$a)
}
}
原文地址:https://www.cnblogs.com/himitsu/p/4846205.html