|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
左手拿着MOTOLOLA右手拿着NOKIA,要多潇洒,有多潇洒,哈哈,终于学会了,但是可能这个时候,又会有人不经意的拍拍肩膀对你说:哥们,别高兴的太早,你还是菜鸟,离学会还差着一大截呢!静态 1、 摘要
本文复杂论述了Proxy形式及详细申明了若何在PHP4中完成静态代办署理, 本文只是给出了一个完成的办法的原型. 因为程度无限, 有任何定见和建议请反应给Binzy [ Binzy at JustDN dot Com ].
2、 概述
在咱们入手下手完成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中你很轻易完成它.
3、 完成
因为PHP4是注释型言语, 弱类型, 且无接口. 所以在完成的时分既无方便的地方又有不当的地方. 此处不拘泥于完成办法, 本文也只是完成办法之一.
本文完成的战略其实十分复杂. 中心即ProxyFactory类及Clazz类, ProxyFactory担任实例化Clazz, 并赋值. 而由Clazz类担任创立并前往Proxy. 创立Proxy是以写入一时文件体例停止的.
详细请检查ProxyFactory.php和Clazz.php二个文件中的代码. 此处不再赘述.
别的在ProxyInvocationHandler.php中咱们界说了一个ProxyInvocationHandler类.
4、 示例
咱们如今有一个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, 这个奥密固然不克不及让她晓得.
5、 总结
代办署理是一个十分有效的形式. PHP4固然并非真实的Object-Oriented, 但依然可以完成你想完成的设计. 写本文的目标有很大局部是但愿国际PHP开辟者不要再拘泥于如今的开辟近况, 开辟出更好的PHP软件. 而不是一堆Script的聚积.
6、 感激
感激密友 Freeman 为我做测试.
感激 mmkk 的Code Formatter HTC.
7、 参考
1. GoF
2. GoF中译本
3. PHP参考手册 http://www.php.net/manual/en/
8、 相干下载
相干附件:本文原代码
理解动态语言的概念,运做机制,熟悉PHP语法 |
|