call_user_func_array

今天在整理redis用法的时候,遇到一个小问题,就是我们在调一些php-redis的时候,并不是所有的类都需要我们封装。

30,
            //选择的数据库。
            'db_id'=>0,
        );
        //什么时候重新建立连接
        protected $expireTime;
        protected $host;
        protected $port;
        public  function __construct($config,$attr=array())
        {
            $this->attr        =    array_merge($this->attr,$attr);
            $this->redis    =    new \Redis();
            $this->port        =    $config['port'] ? $config['port'] : 6379;
            $this->host        =    $config['host']? $config['port'] : '127.0.0.1';
            $this->redis->connect($this->host, $this->port, $this->attr['timeout']);
            if($config['auth'])
            {
                $this->auth($config['auth']);
                $this->auth    =    $config['auth'];
            }
            $this->expireTime    =    time() + $this->attr['timeout'];
        }
        /**
         * 得到实例化的对象.
         * 为每个数据库建立一个连接
         * 如果连接超时,将会重新建立一个连接
         * @param array $config
         * @param int $dbId
         * @return \iphp\db\Redis
         */
        public static function getInstance($config, $attr = array())
        {
            //如果是一个字符串,将其认为是数据库的ID号。以简化写法。
            if(!is_array($attr))
            {
                $dbId    =    $attr;
                $attr    =    array();
                $attr['db_id']    =    $dbId;
            }
            $attr['db_id']    =    $attr['db_id'] ? $attr['db_id'] : 0;
            $k    =    md5(implode('', $config).$attr['db_id']);
            if(! (static::$_instance[$k] instanceof self))
            {
                static::$_instance[$k] = new self($config,$attr);
                static::$_instance[$k]->k        =    $k;
                static::$_instance[$k]->dbId    =    $attr['db_id'];
                //如果不是0号库,选择一下数据库。
                if($attr['db_id'] != 0){
                    static::$_instance[$k]->select($attr['db_id']);
                }
            }
            elseif( time() > static::$_instance[$k]->expireTime)
            {
                static::$_instance[$k]->close();
                static::$_instance[$k]         =     new self($config,$attr);
                static::$_instance[$k]->k    =    $k;
                static::$_instance[$k]->dbId=    $attr['db_id'];
                //如果不是0号库,选择一下数据库。
                if($attr['db_id']!=0){
                    static::$_instance[$k]->select($attr['db_id']);
                }
            }
            return static::$_instance[$k];
        }
        private function __clone(){}
        /*****************hash表操作函数*******************/
        /**
         * 得到hash表中一个字段的值
         * @param string $key 缓存key
         * @param string  $field 字段
         * @return string|false
         */
        public function hGet($key,$field)
        {
            return $this->redis->hGet($key,$field);
        }
        /**
         * 为hash表设定一个字段的值
         * @param string $key 缓存key
         * @param string  $field 字段
         * @param string $value 值。
         * @return bool 
         */
        public function hSet($key,$field,$value)
        {
            return $this->redis->hSet($key,$field,$value);
        }
        /**
         * 判断hash表中,指定field是不是存在
         * @param string $key 缓存key
         * @param string  $field 字段
         * @return bool
         */
        public function hExists($key,$field)
        {
            return $this->redis->hExists($key,$field);
        }
        /**
         * 删除hash表中指定字段 ,支持批量删除
         * @param string $key 缓存key
         * @param string  $field 字段
         * @return int
         */
        public function hdel($key,$field)
        {
            $fieldArr=explode(',',$field);
            $delNum=0;
            foreach($fieldArr as $row)
            {
                $row=trim($row);
                $delNum+=$this->redis->hDel($key,$row);
            }
            return $delNum;
        }
        /**
         * 返回hash表元素个数
         * @param string $key 缓存key
         * @return int|bool
         */
        public function hLen($key)
        {
            return $this->redis->hLen($key);
        }

> 然后在使用的时候

namespace app\test\controller;
use app\common\controller\Base;
use database\Redis as redis;
class Index extends Base
{
    public function index(){
        $redis =  redis::getInstance();
    }
}

> 像lSize,sLength这种,我就没必要封装了,用__call回调处理,通过call_user_func_array来传调用PHP-REDIS的方法

30,
            //选择的数据库。
            'db_id'=>0,
        );
        //什么时候重新建立连接
        protected $expireTime;
        protected $host;
        protected $port;
        public  function __construct($config,$attr=array())
        {
            $this->attr        =    array_merge($this->attr,$attr);
            $this->redis    =    new \Redis();
            $this->port        =    $config['port'] ? $config['port'] : 6379;
            $this->host        =    $config['host']? $config['port'] : '127.0.0.1';
            $this->redis->connect($this->host, $this->port, $this->attr['timeout']);
            if($config['auth'])
            {
                $this->auth($config['auth']);
                $this->auth    =    $config['auth'];
            }
            $this->expireTime    =    time() + $this->attr['timeout'];
        }
        /**
         * 得到实例化的对象.
         * 为每个数据库建立一个连接
         * 如果连接超时,将会重新建立一个连接
         * @param array $config
         * @param int $dbId
         * @return \iphp\db\Redis
         */
        public static function getInstance($config, $attr = array())
        {
            //如果是一个字符串,将其认为是数据库的ID号。以简化写法。
            if(!is_array($attr))
            {
                $dbId    =    $attr;
                $attr    =    array();
                $attr['db_id']    =    $dbId;
            }
            $attr['db_id']    =    $attr['db_id'] ? $attr['db_id'] : 0;
            $k    =    md5(implode('', $config).$attr['db_id']);
            if(! (static::$_instance[$k] instanceof self))
            {
                static::$_instance[$k] = new self($config,$attr);
                static::$_instance[$k]->k        =    $k;
                static::$_instance[$k]->dbId    =    $attr['db_id'];
                //如果不是0号库,选择一下数据库。
                if($attr['db_id'] != 0){
                    static::$_instance[$k]->select($attr['db_id']);
                }
            }
            elseif( time() > static::$_instance[$k]->expireTime)
            {
                static::$_instance[$k]->close();
                static::$_instance[$k]         =     new self($config,$attr);
                static::$_instance[$k]->k    =    $k;
                static::$_instance[$k]->dbId=    $attr['db_id'];
                //如果不是0号库,选择一下数据库。
                if($attr['db_id']!=0){
                    static::$_instance[$k]->select($attr['db_id']);
                }
            }
            return static::$_instance[$k];
        }
        private function __clone(){}
        /*****************hash表操作函数*******************/
        /**
         * 得到hash表中一个字段的值
         * @param string $key 缓存key
         * @param string  $field 字段
         * @return string|false
         */
        public function hGet($key,$field)
        {
            return $this->redis->hGet($key,$field);
        }
        /**
         * 为hash表设定一个字段的值
         * @param string $key 缓存key
         * @param string  $field 字段
         * @param string $value 值。
         * @return bool 
         */
        public function hSet($key,$field,$value)
        {
            return $this->redis->hSet($key,$field,$value);
        }
        /**
         * 判断hash表中,指定field是不是存在
         * @param string $key 缓存key
         * @param string  $field 字段
         * @return bool
         */
        public function hExists($key,$field)
        {
            return $this->redis->hExists($key,$field);
        }
        /**
         * 删除hash表中指定字段 ,支持批量删除
         * @param string $key 缓存key
         * @param string  $field 字段
         * @return int
         */
        public function hdel($key,$field)
        {
            $fieldArr=explode(',',$field);
            $delNum=0;
            foreach($fieldArr as $row)
            {
                $row=trim($row);
                $delNum+=$this->redis->hDel($key,$row);
            }
            return $delNum;
        }
        /**
         * 返回hash表元素个数
         * @param string $key 缓存key
         * @return int|bool
         */
        public function hLen($key)
        {
            return $this->redis->hLen($key);
        }
        /**
     * [__call description]
     * @Author   Jerry
     * @DateTime 2018-08-08T10:48:11+0800
     * @Example  eg:
     * @param    [type]                   $methodName [方法名]
     * @param    [type]                   $argument   [参数]
     * @return   [type]                               [description]
     */
    public function __call($methodName, $argument){

        return call_user_func_array(array($this->redis, $methodName), $argument);

        
    }