网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > PHP > PHP编程代码 > PHP4中实现动态代理  

PHP4中实现动态代理

2006-03-28  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

作者:Binzy 来源:超越PHP

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

网管u家u.bitscn@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中你很容易实现它.

网管联盟bitsCN@com

三、 实现
由于PHP4是解释型语言, 弱类型, 且无接口. 所以在实现的时候既有方便之处又有不妥之处. 此处不拘泥于实现方法, 本文也只是实现方法之一.
本文实现的策略其实非常简单. 核心即ProxyFactory类及Clazz类, ProxyFactory负责实例化Clazz, 并赋值. 而由Clazz类负责创建并返回Proxy. 创建Proxy是以写入临时文件方式进行的.
具体请查看ProxyFactory.php和Clazz.php二个文件中的代码. 此处不再赘述.
另外在ProxyInvocationHandler.php中我们定义了一个ProxyInvocationHandler类.

中国网管论坛bbs.bitsCN.com

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

清单一
class IReadFileClass
{
function ReadMyFile() {}
} 网管u家u.bitscn@com

网管u家u.bitscn@com

清单二
class ReadFileClass extends IReadFileClass
{
function ReadMyFile()
{

网管网www_bitscn_com

$fp = fopen('test.txt', "r");
$data = fread($fp, filesize('test.txt'));
fclose($fp);
return $data;
}
} 网管u家u.bitsCN.com

网管论坛bbs_bitsCN_com

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

网管网www.bitscn.com

请看清单三的ReadFileClassProxy的代码, 注意该类继承自ProxyInvocationHandler类. 网管u家u.bitscn@com

清单三
require_once('ProxyFactory.php');
require_once('ProxyInvocationHandler.php');
require_once('Auth.php'); 中国网管联盟bitsCN.com

class ReadFileClassProxy extends ProxyInvocationHandler
{ 网管网www_bitscn_com

var $object; 网管下载dl.bitscn.com

function ReadFileClassProxy(&$obj)
{
$this->object = &$obj;
} 中国网管联盟bitsCN.com

//
function NewInstance(&$obj)
{
$proxyFactory = ProxyFactoryInstance();
return $proxyFactory->create(new ReadFileClassProxy(&$obj),
get_parent_class(&$obj));
}

中国网管论坛bbs.bitsCN.com

// $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!';
}
}
} 中国网管论坛bbs.bitsCN.com

网管u家u.bitsCN.com

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

网管论坛bbs_bitsCN_com

清单四
class Auth
{
function Auth()
{
}
// bool
//
function CheckAuth($username)
{
if ($username == 'Binzy')
{
return true;
}
return false;
}
} 网管联盟bitsCN@com


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

网管联盟bitsCN_com

清单五
require_once('ReadFileClass.php');
require_once('ReadFileClassProxy.php');

网管bitscn_com

$proxy = ReadFileClassProxy::NewInstance(new ReadFileClass());
print $proxy->ReadMyFile(); 中国网管联盟bitsCN.com

网管联盟bitsCN@com

结果如下:
如果是Binzy, 那么自然可以知道那个秘密.

网管论坛bbs_bitsCN_com

网管u家u.bitscn@com

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

网管下载dl.bitscn.com

网管u家u.bitsCN.com

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

网管u家u.bitsCN.com


TAGs   代理   动态   实现   Proxy   我们   一个   创建   清单   PHP4   &      
 上一篇:做个自己站内搜索引擎   下一篇:xml php动态载入与分页
PHP4中实现动态代理 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: