將屬性設為 private 符合封裝原則,但外部無法直接讀寫。PHP 5 提供四個魔術方法攔截對不可見屬性的操作:
| 方法 | 觸發時機 | 參數 | 回傳值 |
|---|---|---|---|
__get($name) | 讀取不可見屬性 | 屬性名 | 屬性值或 null |
__set($name, $value) | 寫入不可見屬性 | 屬性名、值 | 無 |
__isset($name) | isset($obj->prop) | 屬性名 | bool |
__unset($name) | unset($obj->prop) | 屬性名 | 無 |
class Person {
private $name, $sex, $age;
public function __get($name) {
echo "__get() 呼叫:$name
";
return isset($this->$name) ? $this->$name : null;
}
public function __set($name, $value) {
echo "__set() 呼叫:$name = $value
";
$this->$name = $value;
}
public function __isset($name) {
echo "__isset() 呼叫:$name
";
return isset($this->$name);
}
public function __unset($name) {
echo "__unset() 呼叫:$name
";
unset($this->$name);
}
}
$p = new Person();
$p->name = "張三"; // 觸發 __set
$p->sex = "男";
$p->age = 20;
echo $p->name . "
"; // 觸發 __get
echo $p->sex . "
";
echo $p->age . "
";
var_dump(isset($p->name)); // 觸發 __isset
unset($p->name); // 觸發 __unset
echo $p->name; // null(已刪除)
__set 中過濾非法值。__get 中按需從資料庫讀取。這四個方法必須定義為 public 才會被自動呼叫。