zoukankan      html  css  js  c++  java
  • PHP开发模式之代理技术

    在实际开发中,我们经常要调用第三方的类库如SOAP服务等。使用这些第三方 组件并不难,最麻烦的莫过于调用了,一般的调试手段最方便的莫过于记日志了。 示例: 假如有以下第三方类库。

    // filename: user.php
    class user{
        // 得到用户信息
        public function getInfo($uid){
      
        }
    }

      

    一般的程序员写的调用代码可能是: include 'user.php'; $face = new user(); $uid = 100; // 参数写日志 $info = $face->getInfo($uid); // 返回的结果再写日志 这里有个问题,如果要用到第三方接口很多,则这种方式将是一个恶梦的开始; 这里我采用一种Proxy代理方式,在 Ruby 语言中有一个非常专业 的名词AOP可以形容这种技术,即动态的为类增强方法。

    // 代理技术
    class VProxy{
      
        // 单例,如果在复杂资源时比较有用,如SOAP/DB等
        static private $_instance = array();   
      
        /**
         * 单例模式返回实现(推荐)
         *
         * @param string $model 接口模型名
         * @return object
         */
        static public function getInstance($model)
        {
            $model = strtolower($model);
            if(!isset(self::$_instance[$model])){
                self::$_instance[$model] = new self($model);
            }
            return self::$_instance[$model];
        }
      
        /**
         * 当前调用接口的实例
         *
         * @var unknown_type
         */
        private $_model = null;
        private $_modelName = '';
      
        /**
         * 构造函数
         *
         * @param string $model 接口模型名
         */
        public function __construct($model){
            include_once($model.'.php');
            $this->_modelName = $model;
            $this->_model = new $model;
        }
      
        /**
         * proxy核心方法
         *
         * @param string $functionName :方法名
         * @param mixed $args :传给方法的参数
         * @return unknown
         */
        public function __call($functionName,$args)
        {
            // 调用接口
            $result = call_user_func_array(array($this->_model, $functionName), $args));
            // 写日志
            writeLog($this->_modelName,$functionName,$args,$result);
            // 返回结果
            return $result;
        }
    }
      
    // 调用实例
    $face = VProxy::getInstance('user');
    $info = $face->getInfo(100);

      

    该实例子只是起个画龙点睛而以,具体实现应用比这种复杂,利用以上技术还可以为接口增加相关的方法, 这点就类似Javascript中对象的特性了,具体自己尝试下吧!我在迅雷具体项目中经常用到该技术, 比如说为部门提供公共服务接口等。

    转自:http://www.vquickphp.com/?a=blogview&id=25

  • 相关阅读:
    ElasticSearch应用之数据埋点——认识埋点
    WebStorm好用的插件推荐
    mysql身份验证问题
    (一) MySql的安装
    (一)Mongodb的下载与安装
    解决Flask中 request.get_json()接收不到传来的json数据
    docker查看日志记录
    微信小程序右上角胶囊的信息
    linux shell 字符串操作(长度,查找,替换)详解
    Win7下的内置FTP组件的设置详解
  • 原文地址:https://www.cnblogs.com/php-rearch/p/6159449.html
Copyright © 2011-2022 走看看