PHP 魔術方法__set() __get() 方法


看代碼:


<?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
?>

由代碼可以知道,

  1. 從一個難以訪問的屬性讀取數據的時候 __get() 方法被調用
  2. 向一個難以訪問的屬性賦值的時候 __set() 方法被調用
  3. 難以訪問包括:(1)私有屬性,(2)沒有初始化的屬性
  4. __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屬性不會調用到魔法方法,
配置中的一些變量,則會調用到魔法方法。

這種機制對於配置設置還是很有幫助的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM