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属性不会调用到魔法方法,
配置中的一些变量,则会调用到魔法方法。

这种机制对于配置设置还是很有帮助的。

posted @ 2016-04-20 10:02  TBHacker  阅读(3078)  评论(0编辑  收藏  举报