PHP4 中实现动态代理

2016-02-19 16:49 15 1 收藏

下面图老师小编跟大家分享PHP4 中实现动态代理,一起来学习下过程究竟如何进行吧!喜欢就赶紧收藏起来哦~

【 tulaoshi.com - Web开发 】

  一、 摘要

  本文简单阐述了 Proxy 模式及具体说明了如何在 PHP4 中实现动态代理,本文只是给出了一个实现的方法的原型。由于水平有限,有任何意见和建议请反馈给 Binzy [ Binzy at JustDN dot Com ]。

  二、 概述

  在我们开始实现 Dynamic Proxy 之前,也许我们应该先了解一下什么是 Proxy 和它有什么用。下面是一篇来自博客堂加菲猫的不错的形象讲述 Proxy 的文章: 武当学艺与缓存代理。Proxy 模式是GoF介绍的23个设计模式之一,Proxy 的目的是 Provide a surrogate or placeholder for another object to control access to it(为其他对象提供一种代理以控制对这个对象的访问)。一般常见的代理模式有:远程代理(Remote Proxy),虚代理(Virtual Proxy),保护代理(Protection Proxy),智能代理(Smart Proxy)。

  但是使用代理有一个坏处就是你得手动创建所需要代理类的副本(即代理类)。这意味着如果你为 Image 类创建一个 Virtual Proxy,那么你不得不手动创建一个与 Image 类有相同 Method 的 ImageProxy 类。Ok,如果你和我一样懒,你一定会想到动态来产生Proxy。是的,接下来你就会发现,其实在PHP4中你很容易实现它。

  三、 实现

  由于 PHP4 是解释型语言,弱类型,且无接口。所以在实现的时候既有方便之处又有不妥之处。此处不拘泥于实现方法,本文也只是实现方法之一。

  本文实现的策略其实非常简单。核心即 ProxyFactory 类及 Clazz 类,ProxyFactory 负责实例化 Clazz,并赋值。而由 Clazz 类负责创建并返回 Proxy。创建 Proxy 是以写入临时文件方式进行的。

  具体请查看 ProxyFactory.php 和 Clazz.php 二个文件中的代码。此处不再赘述。

  另外在 ProxyInvocationHandler.php 中我们定义了一个 ProxyInvocationHandler 类。

  四、 示例

  我们现在有一个 ReadFileClass 类,该类继承自 IReadFileClass,由于 PHP4 没有接口,所以此处接口算是模拟的,事实上在PHP4中不使用实现接口也是可行的J。二个类的具体内容请见清单一和清单二。

  清单一

  

class IReadFileClass{  function ReadMyFile() {}}

  清单二

  

class ReadFileClass extends IReadFileClass{  function ReadMyFile()  {    $fp = fopen('test.txt', "r");    $data = fread($fp, filesize('test.txt'));    fclose($fp);    return $data;  }}

  OK,我们现在要加入验证用户的功能,即为 ReadFileClass 中的方法加入保护控制。如果采用手动创建代理,那么你可以继承 ReadFileClass 或者实现 IReadFileClass,并加入保护代码(其实在 PHP4 中甚为自由,因为除了基本类型外都是 object -_-)。不过我们现在试试用刚才实现的动态代理来创建 Proxy。

  请看清单三的 ReadFileClassProxy 的代码,注意该类继承自 ProxyInvocationHandler 类。

  清单三

  

require_once('ProxyFactory.php');require_once('ProxyInvocationHandler.php');require_once('Auth.php');class ReadFileClassProxy extends ProxyInvocationHandler{  var $object;  function ReadFileClassProxy(&$obj)  {    $this-object = &$obj;  }  //  function NewInstance(&$obj)  {    $proxyFactory = ProxyFactoryInstance();    return $proxyFactory-create(new ReadFileClassProxy(&$obj),    get_parent_class(&$obj));  }  // $proxy is not used here,but it is useful.  function Invoke(&$proxy, $method, $parameters)  {    $uname = 'Binzy';    //$uname = 'Jasmin';    if (Auth::CheckAuth($uname))    {      Return parent::Invoke(&$proxy, $method, $parameters);    }    else    {      //      return 'No Permission!';    }  }}

  Auth 类是一个进行权限验证的类,此处我们只是简单的查看传入的 UserName,如果是 Binzy,那么自然是可以看秘密的 J,如果是 Jasmin,那么 HoHo,没得看,给 Binzy 点空间嘛  详见清单四。

  清单四

  

class Auth{  function Auth()  {  }  // bool  //  function CheckAuth($username)  {    if ($username == 'Binzy')    {      return true;    }    return false;  }}

  Ok,下面我们来使用我们创建的代理。请见清单五.

  清单五

  require_once('ReadFileClass.php');

  require_once('ReadFileClassProxy.php');

  $proxy = ReadFileClassProxy::NewInstance(new ReadFileClass());

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  print $proxy-ReadMyFile();

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  结果如下:

  如果是Binzy,那么自然可以知道那个秘密。

  如果是Jasmin,这个秘密当然不能让她知道.

  五、 总结

  代理是一个非常有用的模式。PHP4 虽然并不是真正的 Object-Oriented,但仍然可以实现你想实现的设计。写本文的目的有很大部分是希望国内 PHP 开发者不要再拘泥于现在的开发现状,开发出更好的 PHP 软件。而不是一堆 Script 的堆积。

  六、 感谢

  感谢好友 Freeman 为我做测试。

  感谢 mmkk 的 Code Formatter HTC。

  七、 参考

  1。GoF

  2。GoF中译本

  3。PHP参考手册 http://www.php.net/manual/en/

本文示例代码或素材下载

来源:http://www.tulaoshi.com/n/20160219/1613195.html

延伸阅读
标签: PHP
  <? /*************************************** ** Title.........: PHP4 HTTP Compression Speeds up the Web ** Version.......: 1.10 ** Author........: catoc <catoc@163.net ** Filename......: gzdoc.php ** Last changed..: 25/08/2000 ** Requirments...: PHP4 = 4.0.1 ** PHP was configured with --with-zlib[=...
标签: PHP
  标 题: 使用php4加速网络传输。 <? /*************************************** ** Title.........: PHP4 HTTP Compression Speeds up the Web ** Version.......: 1.10 ** Author........: catoc <catoc@163.net ** Filename......: gzdoc.php ** Last changed..: 25/08/2000 ** Requirments...: PHP4 = 4.0.1 ** &...
标签: PHP
PHP4之COOKIE支持详解      建立商业站点或者功能比较完善的个人站点,常常需要记录访问者的信息,在PHP中提供了两种方便的手段:session和cookie功能.为了永久的保持用户信息,则cookie是最便捷的手段.在这里我将为大家详细的讲解cookie的功能及使用方法.     一: 设置cookie ...
标签: Web开发
PHP4之真OO 文的作者Johan Persson是PHP中著名的JpGraph图表类库的开发者. 本文是作者对于在PHP4中进行面向对象开发时需要注意的几个小问题的总结. 翻译: Binzy Wu [Mail: Binzy at JustDN dot COM], 水平有限, 欢迎探讨. 2004-2-4 简介 本文的对象是那些曾使用更加成熟的OO [1] 语言, 如Eiffel, Java, C# [2] or C++(), 进行开发的朋友(如...
标签: PHP
       · mymoon编译整理·转自CPCW       PHP 4.0 是更有效的,更可靠的动态Web页开发工具,在大多数情况运行比 PHP 3.0 快,其脚本描述更强大并且更复杂, 最显著的特征是速率比的增加。PHP4.0 这些优异的性能是PHP 脚本引擎重新设计产生的结果:引擎由 AndiGutmans 和 Zeev Suras...

经验教程

188

收藏

11
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部