zoukankan      html  css  js  c++  java
  • 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属性不会调用到魔法方法,
    配置中的一些变量,则会调用到魔法方法。

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

  • 相关阅读:
    聚集索引
    第一天 尝试Thread
    sql 分区函数
    sql 查询表定义
    千万数量级分页存储过程
    成语解释
    sql 分组查询满足条件所以数据
    sql存储过程
    联表更新的反思
    从表保存了主表的id,以分号分隔,怎么样用一条sql搞定主表满足条件的查询? 不希望单独写存储过程,或者后台拆成int后传进来,就一条sql 搞定,一条
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/5411403.html
Copyright © 2011-2022 走看看