解析魔術方法之__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)
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM