Ò»¡¢ ÕªÒª
±¾Îļòµ¥²ûÊöÁË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ÖÐÄãºÜÈÝÒ×ʵÏÖËü.
Èý¡¢ ʵÏÖ
ÓÉÓÚPHP4ÊǽâÊÍÐÍÓïÑÔ, ÈõÀàÐÍ, ÇÒÎÞ½Ó¿Ú. ËùÒÔÔÚʵÏÖµÄʱºò¼ÈÓз½±ãÖ®´¦ÓÖÓв»Í×Ö®´¦. ´Ë´¦²»¾ÐÄàÓÚʵÏÖ·½·¨, ±¾ÎÄÒ²Ö»ÊÇʵÏÖ·½·¨Ö®Ò».
±¾ÎÄʵÏֵIJßÂÔÆäʵ·Ç³£¼òµ¥. ºËÐļ´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/
°Ë¡¢ Ïà¹ØÏÂÔØ
Ïà¹Ø¸½¼þ£º±¾ÎÄÔ´úÂë

