簡單來說,這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) } }