在实际开发中,我们经常要调用第三方的类库如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. Windows下查看进程及结束进程命令[转]

    Windows下查看进程及结束进程命令 1)查看占用8080端口的进程号 >netstat –aon | findstr “8080” 结果:TCP    0.0.0.0:8080        ...

  2. httpwebrequest详解【转】

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

  3. django Q和F查询

    Q查询——对对象的复杂查询F查询——专门取对象中某列值的操作 Q查询1.Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询,例如: from django. ...

  4. 今年几个项目中用到的一个jqueryTab插件感觉挺好用的

    名字叫:wdscrolltab 开源中国项目地址: http://www.oschina.net/p/wdscrolltab

  5. [CF225C] Barcode (简单DAG上dp)

    题目链接:http://codeforces.com/problemset/problem/225/C 题目大意:给你一个矩阵,矩阵中只有#和.两种符号.现在我们希望能够得到一个新的矩阵,新的矩阵满足 ...

  6. Array,ArrayList、List<T>、HashSet<T>、LinkedList<T>与Dictionary<K,V>

    Array: 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. 但是数组存在一些不足的地方.在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候 ...

  7. 11. Evaluate Reverse Polish Notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  8. jface的CheckboxTreeViewer实现单选

    需求:使用FilteredTree实现一个下面这样的Dialog,要求Check框单选,即只能选择一个:当选择新的时候,旧的不选.说明:FilteredTree自带一个文本输入框. 1.自己的类继承o ...

  9. Visual Studio 2013新建工程导入现有代码文件夹并且保持目录结构

    本文提供了一个在Windows环境下使用Visual Studio 2013编辑现有源代码并且保持目录结构的方法.本文使用VS2013中文社区版做示例(本版本为免费版,可在VS官网下载),其他版本的V ...

  10. 最小生成树(HDOJ 1863)

    畅通工程 http://acm.hdu.edu.cn/showproblem.php?pid=1863 1.Prim算法: Prim算法是由一个点(最初的集合)向外延伸,找到与集合相连权值最小的边, ...