在实际开发中,我们经常要调用第三方的类库如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

PHP开发模式之代理技术的更多相关文章

  1. 代理模式 & Java原生动态代理技术 & CGLib动态代理技术

    第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...

  2. 《JavaScript设计模式与开发实践》-- 代理模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-daili/ 代理模式 1.定义 代理模式:代理模式是为一个对象提供一个代用品或占位符,以便控 ...

  3. 企业应用开发模式 ERP项目中应用到的技术和工具

    一.基础技术选型 C# .NET 3.5/4.0  这两个版本的.NET已经相当方便(Linq, Lambda,Parallel),语法简洁,配合WCF和WF两项技术,可以满足快速开发,维护方便的目标 ...

  4. MyBatis之代理开发模式

    1 mybatis-Dao的代理开发模式 Dao:数据访问对象 原来:定义dao接口,在定义dao的实现类 dao的代理开发模式 只需要定义dao接口,由mybatis产生dao接口的实现类. 1.1 ...

  5. 动态页面技术----EL技术、JSTL技术,javaEE的开发模式

    1 EL技术 1.1 EL 表达式 EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写, EL出现的目的是要替代jsp页面中脚本的编写,就是简化java代码. ...

  6. jsp基础、el技术、jstl标签、javaEE的开发模式

    一.jsp技术基础 1.jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> ...

  7. java 开发模式

    Java-开发模式 Java Web开发方案有多种,这里列举一些经典的开发模式进行横向比较JSP+JAVABEAN开发模式:    特点:该模式将业务逻辑与页面表现进行分离,在一定程度上增加了程序的可 ...

  8. Java开发web的几种开发模式

    Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket等等)并不了解,这里就不 ...

  9. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

随机推荐

  1. Asp.net MVC 之过滤器

    整理一下MVC中的几种过滤器,以及每种过滤器是干什么用的 四种过滤器 1.AuthorizationFilter(授权过滤器) 2.ActionFilter(方法过滤器) 3.ResultFilter ...

  2. (C#) 反转字符串,反转一个句子中单词。

    这个是非常基本的一道面试题,但是要考虑周全. 首先反转一个字符串: 基本思路是变成Char数组,然后调用C#里面的方法,或者设定两个index,从头,尾向中间遍历,并交换. 方法一: Array.Re ...

  3. python分布式任务调度Celery

    Celery是Python开发的分布式任务调度模块,今天抽空看了一下,果然接口简单,开发容易,5分钟就写出了一个异步发送邮件的服务. Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前 ...

  4. httpwebrequest详解【转】

    http://blog.csdn.net/sjj2011/article/details/7823392 HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最 ...

  5. 【javascript基础】6、new与构造函数

    前言 上篇说创建对象的时候提到了带返回值的构造函数,那里没有和大家说这个问题,今天就和大家一起学习构造函数和new操作符.我也是最近才稍微弄明白点这个构造函数,以前总是忽略一些问题,现在就是想到哪块不 ...

  6. 技术那么多,你想看看JSON Schema的测试吗?

    目录 1. 什么是JSON Schema? 2. 如何定义一个JSON Schema 3. 如何测试JSON Schema a) 使用JSON Schema validator GUI b) 在Jav ...

  7. Selenium

    Selenium可以抓取完整的页面的html但是request 和java的url不能抓的很完整. selenium的方法是dirver.page_source

  8. Spark Streaming源码解读之Job动态生成和深度思考

    本期内容 : Spark Streaming Job生成深度思考 Spark Streaming Job生成源码解析 Spark Core中的Job就是一个运行的作业,就是具体做的某一件事,这里的JO ...

  9. SQL笔记 [长期更新] (-2015.4)

    [遍历所有表,复制表结构,复制表数据] --插入语句SELECT * INTO A FROM B 是在还没有A表的情况下,直接通过B表创建并把B表数据复制到A表里面,之后A,B表的结构和数据完全一样. ...

  10. go特性学习

    而后我写了一些测试代码: dept1 :=     Dept{         name:     "MySohu",         building: "Intern ...