• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP4中实现动态代理_php

php 搞代码 7年前 (2018-06-19) 134次浏览 已收录 0个评论

一、 摘要
本文简单阐述了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中你很容易实现它.

http://www.gaodaima.com/45086.htmlPHP4中实现动态代理_php

三、 实现
由于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点空间嘛.:D 详见清单四.

清单四
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参考手册 http://www.php.net/manual/en/

八、 相关下载
相关附件:本文原代码

欢迎大家阅读《PHP4中实现动态代理_php》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP4中实现动态代理_php

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址