參考:
http://php.net/manual/en/language.oop5.overloading.php
說明:
public void __set ( string $name , mixed $value )
public mixed __get ( string $name )
__get 執行時機:嘗試取得不存在的屬性或無權訪問的屬性。
__set 執行時機:嘗試設定不存在的屬性或無權訪問的屬性。
範例:
class aa{ private $pri = "private test"; public $pub = "public test"; public function __get($name){ echo "執行 __get()=> name: $name"; } public function __set($name,$value){ echo "執行 __set()=> name: $name , value: $value"; } } $obj = new aa(); //private 屬性 $obj->pri; //執行 __get()=> name: pri $obj->pri = "xyz";//執行 __set()=> name: pri , value: xyz //public 屬性 $obj->pub; //不會執行 __get() $obj->pub = "xyz"; //不會執行 __get() //不存在的屬性 $obj->no; //執行 __get()=> name: no $obj->no = "xyz"; //執行 __set()=> name: no , value: xyz
實例應用:
若原本有一 class ,有一 public 的屬性,整個系統程式到處直接存取、設定這個屬性。如下。
class aa{ public $month = 1; } $obj = new aa(); echo $obj->month; //1 $obj->month = 13; echo $obj->month; //13
若今天想把 echo $obj->month 的輸出,後面多加一個字 "月" (例:1月),
且 $obj->month = 13 這種大於12的設定改成 $obj->month = 12。
如果不想修改全部有使用到的地方,
可利用魔術方法 __get、__set 如下修改。
class aa{ private $month = 1; // public 改為 private public function __get($name){ switch($name){ case "month"; return $this->month . "月"; break; default: return null; } } public function __set($name,$value){ switch($name){ case "month"; if($value < 1){ $this->month = 1; }else if($value > 12){ $this->month = 12; }else{ $this->month = $value; } break; } } } $obj = new aa(); echo $obj->month; //1月 $obj->month = 13; echo $obj->month; //12月
沒有留言:
張貼留言