看代碼:
<?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() 方法被調用
- 向一個難以訪問的屬性賦值的時候 __set() 方法被調用
- 難以訪問包括:(1)私有屬性,(2)沒有初始化的屬性
- __isset() __unset() 也類似
應用,定義配置變量,
public $ossClient,$bucket;
protected $config = array(
'maxSize' => -1, // 上傳文件的最大值
'allowExts' => array(), // 允許上傳的文件后綴 留空不作后綴檢查
'allowTypes' => array(), // 允許上傳的文件類型 留空不做檢查
'savePath' => '',// 上傳文件保存路徑
'saveRule' => 'uniqid',// 上傳文件命名規則
'hashType' => 'md5_file',// 上傳文件Hash規則函數名
);
public function __get($name){
if(isset($this->config[$name])) {
return $this->config[$name];
}
return null;
}
public function __set($name,$value){
if(isset($this->config[$name])) {
$this->config[$name] = $value;
}
}
public function __isset($name){
return isset($this->config[$name]);
}
上面的public屬性不會調用到魔法方法,
配置中的一些變量,則會調用到魔法方法。
這種機制對於配置設置還是很有幫助的。