中完结动态代理
分类:热门资源

一、 摘要

正文简单门船演说了 Proxy 方式及实际表明了怎么在 PHP4 中完成动态代理,本文只是给出了一个落到实处的章程的原型。由于水平有限,有其它思想和建议请举报给 Binzy [ Binzy at JustDN dot Com ]。

二、 概述

在大家早先兑现 Dynamic Proxy 以前,可能我们应该先精晓一下哪些是 Proxy 和它有何用。上面是一篇来自博客堂加菲猫的不错的形象陈诉 Proxy 的篇章: 武当学艺与缓存代理。Proxy 形式是GoF介绍的二十多少个设计形式之一,Proxy 的指标是 Provide a surrogate or placeholder for another object to control access to it(为任何对象提供一种代理以决定对那一个目的的拜会卡塔尔国。日日常见的代办方式有:远程代理(Remote Proxy卡塔尔(قطر‎,虚代理(Virtual Proxy卡塔尔(قطر‎,保护代理(Protection Proxy卡塔尔国,智能代理(斯马特 Proxy卡塔尔(قطر‎。

但是使用代理有两个缺陷即是你得手动创设所急需代理类的别本(即代理类State of Qatar。那意味着一旦您为 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());

print $proxy-ReadMyFile();

结果如下:

即使是Binzy,那么自然能够清楚那些神秘。

只要是Jasmin,那么些地下当然无法让她知道.

五、 总结

代理是二个不胜实惠的情势。PHP4 即使实际不是实在的 Object-Oriented,但如故能够兑现您想落成的宏图。写本文的指标有很超过百分之五十是期待国内PHP 开拓者不要再拘泥于以往的支付现状,开采出更加好的 PHP 软件。并不是一堆Script 的堆叠。

六、 感谢

多谢亲密的朋友 Freeman 为自个儿做测量试验。

感谢 mmkk 的 Code Formatter HTC。

七、 参考

1。GoF

2。GoF中译本

3。PHP参谋手册

本文示例代码或质感下载

本文由威尼斯在线注册平台发布于热门资源,转载请注明出处:中完结动态代理

上一篇:PHP的加密功能 下一篇:没有了
猜你喜欢
热门排行
精彩图文