PHP4ÖÐʵÏÖ¶¯Ì¬´úÀí-PHP¼¼Êõ-3P´úÂëÍø
¡¾·±ÌåÖÐÎÄ¡¿
¡¾ÉèΪÊ×Ò³¡¿
¡¾¼ÓÈëÊղء¿
µ±Ç°Î»ÖãºPHP¼¼ÊõÊ×Ò³ >> PHP»ù´¡ >> PHP4ÖÐʵÏÖ¶¯Ì¬´úÀí

PHP4ÖÐʵÏÖ¶¯Ì¬´úÀí

2005-02-15 08:00:00  ×÷Õߣº  À´Ô´£º»¥ÁªÍø  ä¯ÀÀ´ÎÊý£º0  ÎÄ×Ö´óС£º¡¾´ó¡¿¡¾ÖС¿¡¾Ð¡¡¿
¼ò½é£ºÒ»¡¢ ÕªÒª ±¾Îļòµ¥²ûÊöÁËProxyģʽ¼°¾ßÌå˵Ã÷ÁËÈçºÎÔÚPHP4ÖÐʵÏÖ¶¯Ì¬´úÀí, ±¾ÎÄÖ»ÊǸø³öÁËÒ»¸öʵÏֵķ½·¨µÄÔ­ÐÍ. ÓÉÓÚˮƽÓÐÏÞ, ÓÐÈκÎÒâ¼ûºÍ½¨ÒéÇë·´À¡¸øBinzy [ Binzy at JustDN dot Com ]. ¶þ¡¢ ¸ÅÊö ÔÚÎÒÃÇ...
¹Ø¼ü×Ö£º´úÀí ¶¯Ì¬ PHP4

Ò»¡¢ ÕªÒª

±¾Îļòµ¥²ûÊöÁË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/

°Ë¡¢ Ïà¹ØÏÂÔØ

Ïà¹Ø¸½¼þ£º±¾ÎÄÔ­´úÂë

ÔðÈα༭£ºadmin
±¾ÎÄÒýÓõØÖ·£º http://www.3pcode.com/php/2005/02/12336.htm
Ïà¹ØÎÄÕÂ