PHP4中实现动态代理

2016-01-29 13:30 2 1 收藏

PHP4中实现动态代理,PHP4中实现动态代理

【 tulaoshi.com - PHP 】

作者:Binzy 来源:超越PHP

一、 摘要
本文简单阐述了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.tulaoshi.com/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() {}
}

 

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

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

$fp = fopen('test.txt', "r");
$data = fread($fp, filesize('test.txt'));
fclose($fp);
return $data;
}
}

 

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

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!';
}
}
}

 

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

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();

 

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

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

来源:http://www.tulaoshi.com/n/20160129/1490451.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...