PHP开发模式之代理技术

12/11 编程语言 阅读 502 views 次 人气 0
摘要:

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

评论

该文章不支持评论!

分享到: