先看看官方文檔的解釋
__set() is run when writing data to inaccessible properties.
__get() is utilized for reading data from inaccessible properties.
究竟用中文怎么翻譯呢? inaccessible :n. 難達到;難接近;無法理解。
有代碼有真相:
<?php error_reporting(E_ALL); class stu{ private $a; private $b = 0; public $c; public $d = 0; //這里的 private 可以用 protected public 替代 private function __get($name) { return 123; } //這里的 private 也可以用 protected public 替代 private function __set($name, $value) { echo "This is set function"; } } $s = new stu(); var_dump($s->a); //output: 123 var_dump($s->b); //output: 123 var_dump($s->c); //output: null var_dump($s->d); //output: 0 var_dump($s->e); //output: 123 $s->a = 3; //output: This is set function $s->c = 3; //no output $s->f = 3; //output: This is set function ?>
結果:
如果沒有__get方法,執行 var_dump($s->a) var_dump($s->b) 會有致命的錯誤
如果沒有__get方法,執行 var_dump($s->e) 會有一個notice,提示沒有定義屬性 $e
總結:
1. 從一個難以訪問的屬性讀取數據的時候 __get() 方法被調用
2. 向一個難以訪問的屬性賦值的時候 __set() 方法被調用
3. 難以訪問包括:(1)私有屬性,(2)沒有初始化的屬性
4. __isset() __unset() 也類似