»¶ÓÄú·ÃÎÊÎÒ°®IT¼¼ÊõÍø£¬½ñÌìС±àΪÄã·ÖÏíµÄ±à³Ì¼¼ÊõÊÇ£º¡¾¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚʮһÕ ´úÀíģʽ¡¿£¬ÏÂÃæÊÇÏêϸµÄ·ÖÏí£¡
¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚʮһÕ ´úÀíģʽ
ÒòΪij¸ö¶ÔÏóÏûºÄÌ«¶à×ÊÔ´,¶øÇÒÄãµÄ´úÂë²¢²»ÊÇÿ¸öÂ߼·¾¶¶¼ÐèÒª´Ë¶ÔÏó, ÄãÔøÓйýÑÓ³Ù´´½¨¶ÔÏóµÄÏë·¨Âð ( ifºÍelse¾ÍÊDz»Í¬µÄÁ½ÌõÂ߼·¾¶) ? ÄãÓÐÏë¹ýÏÞÖÆ·ÃÎÊij¸ö¶ÔÏó,Ò²¾ÍÊÇ˵,Ìṩһ×é·½·¨¸øÆÕͨÓû§,ÌØ±ð·½·¨¸ø¹ÜÀíÔ±Óû§?ÒÔÉÏÁ½ÖÖÐèÇ󶼷dz£ÀàËÆ£¬²¢ÇÒ¶¼ÐèÒª½â¾öÒ»¸ö¸ü´óµÄÎÊÌâ:ÄãÈçºÎÌṩһÖµĽӿڸøÄ³¸ö¶ÔÏóÈÃËü¿ÉÒԸıäÆäÄÚ²¿¹¦ÄÜ,»òÕßÊÇ´ÓÀ´²»´æÔڵŦÄÜ?
ÎÊÌâ:
ÄãÔõÑù²ÅÄÜÔÚ²»Ö±½Ó²Ù×÷¶ÔÏóµÄÇé¿öÏÂ,¶Ô´Ë¶ÔÏó½øÐзÃÎÊ?
½â¾ö·½°¸
´úÀíģʽÊǸøÄ³Ò»¸ö¶ÔÏóÌṩһ¸öÌæ´úÕß(ռλÕß),ʹ֮ÔÚclient¶ÔÏóºÍsubject¶ÔÏóÖ®¼ä±àÂë¸üÓÐЧÂÊ¡£´úÀí¿ÉÒÔÌṩÑÓ³ÙʵÀý»¯(lazy instantiation),¿ØÖÆ·ÃÎÊ, µÈµÈ£¬°üÀ¨Ö»ÔÚµ÷ÓÃÖд«µÝ¡£ Ò»¸ö´¦Àí´¿±¾µØ×ÊÔ´µÄ´úÀíÓÐʱ±»³Æ×÷ÐéÄâ´úÀí¡£Ô¶³Ì·þÎñµÄ´úÀí³£³£³ÆÎªÔ¶³Ì´úÀí¡£Ç¿ÖÆ¿ØÖÆ·ÃÎʵĴúÀí³ÆÎª±£»¤´úÀí¡£
ÏÂÃæÓÐÒ»¸ö¹ØÓÚÔ¶³Ì´úÀíµÄͼ(Ö»ÓÐÒ»¸ö·½·¨)¡£ SoapClientÊDZ¾µØ¶ÔÏó(¿Í»§¶Ë)µÄý½é,ͨ¹ýµ÷ÓÃSoapServer(subject)À´»ñµÃÌìÆøÐÅÏ¢¡£È«²¿ÈÎÎñ¶¼Í¨¹ýHTTPÐÒé´ï³É,±ÈÈç´´½¨,´«Êä,½ÓÊÕ,ͨ¹ýSoapClientÀàÄÚ²¿µÄ¹¦ÄܽâÎö¸´ÔÓXMLÎĵµÍê³ÉÔ¶³ÌͨÐÅ¡£ÍøÂç·µ»ØµÄ½á¹û¸úÖ±½Óµ÷ÓÃSoapServer¶ÔÏóAPIµÄЧ¹ûÒ»ÑùµÄ,Òò´ËSoapClient¿ÉÊÓΪһ¸ö±¾µØµÄ´úÌæÕß(´úÀí),À´»ñµÃÔ¶³ÌSoapServerµÄ×ÊÔ´¡£
ÕâÀïÓÐÆäËû²»Í¬ÖÖÀàµÄ´úÀíģʽ½Ð×ösmart ´úÀí¡£ËüµÄ×÷ÓÃÊÇ:ÔÚÔÊÐí·ÃÎÊsubject¶ÔÏó֮ǰÔö¼ÓһЩ¸÷ÖÖ¸÷ÑùµÄ¸½¼ÓÂß¼(additional logic)¡£(Òë×¢:ÕâÀïµÄ¸½¼ÓÂß¼ÊÇÖ¸ÔÚ½¨Á¢ÁË´úÀíģʽµÄ»ù±¾½á¹¹Ö®ºó,¸ù¾Ý×Ô¼ºµÄÐèÇóÔÚ´úÀíģʽÖÐÌí¼ÓµÄ´úÂë)
×¢£ºHandle-Body ģʽ
´úÀíģʽ, ×°ÊÎÆ÷ģʽ, ºÍÊÊÅäÆ÷ģʽ´Ó±àÂë½Ç¶È¿´,¶¼ÓÐÀàËÆµÄ½á¹¹µÄ(ºóÁ½¸öģʽÔÚÏÂÃæÁ½Õ½²)¡£
ÈýÖÖģʽ±¾ÖÊÇø±ðÔÚÓÚÈçºÎʹÓÃËüÃÇ¡£
Õâ¸ö½á¹¹µÄÆäËû±äÖÖÔÚÏÂÃæÍøÖ·¿ÉÒÔÕÒµ½:http://www¡£c2¡£com/cgi/wiki?HandleBodyPattern¡£
ÀíµÄ±¾ÖÊÊÇÓÃÒ»¸öʵÀý»¯±äÁ¿¶Ôsubject¶ÔÏó½øÐÐÒýÓÃ,ͨ¹ýµ÷ÓôúÀíÀàµÄ·½·¨²Ù×÷subjectÀà¡£
ÈÃÎÒÃÇ¿´Ò»¸ö´úÀíģʽµÄ×î¼òµ¥ÐÎ̬,Ê×ÏÈ,ÄãÐèÒª´´½¨Ò»¸ösubjectÀàÓÃÓÚ´úÀí¡£
| // PHP4 class Subject { function someMethod() { sleep(1); //do something } } |
ÏÂÒ»²½,ÄãÐèÒªÒ»¸ö´úÀíÀà,Õâ¸öÀàÐèҪʵÀý»¯subjectÀàÓÃÓÚ´úÀí¡£
| class ProxySubject { var $subject; function ProxySubject() { $this->subject=& new Subject; } } |
ÔÚÉÏÃæµÄProxySubjectÀà,ÔÚ¹¹ÔìÆ÷Öд´½¨ÁËsubject¶ÔÏó(»¹ÓÐÆäËûµÄ¿É¹©Ñ¡ÔñµÄ·½·¨,±ÈÈçͨ¹ý´«µÝÒ»¸ö²ÎÊý¸ø¹¹ÔìÆ÷»òÕßÓù¤³§´´½¨subject¶ÔÏó,ÕâЩ¶¼ÊÇͬÑù¿ÉÐеÄ)¡£
×îºó,ÄãµÄ´úÀíÀàÌṩËùÓй«Óеķ½·¨±ØÐëÈÃsubjectÀàÖ§³Ö¡£ÔÚÕâ¸ö°¸ÀýÉÏ, someMethod()¾ÍÊÇÕâÑùÒ»¸ö·½·¨¡£
| class ProxySubject { var $subject; function ProxySubject() { $this->subject=& new Subject; } function someMethod() { $this->subject->someMethod(); } } |
ProxySubjectÀàͨ¹ý$this->subject->someMethod()²ÅÕæÕýµÄµ÷ÓÃSubjectÀà¡£
´úÀí¼È¿ÉÒÔÓÐһЩ·½·¨Ö±½Óµ÷ÓÃ,ÓÖ¿ÉÒÔÔÚµ÷ÓÃ֮ǰʹÓÃһЩ¸½¼ÓÂß¼(ÑÓ³Ù¼ÓÔØ,¼àÊÓ)¡£
ÕâÀïÓÃÁËÒ»¸öUMLÀàͼ±íʾProxySubjectÀà:
Ò»¸ö¼òµ¥µÄÀý×Ó
ÉÏÃæµÄ¼òµ¥Àý×ÓչʾÁË´úÀíģʽµÄ»ù±¾½á¹¹,µ±È»ÎÒÃÇÐèҪһЩ¸üÓÐȤºÍʵ¼ÊµÄÀý×Ó¡£
Web·þÎñ±äµÃ·Ç³£Á÷ÐÐ,PHP5°üº¬ÁËһЩ֧³ÖµÄºÜºÃµÄÐÒé,¾ÍÈçSOAPÒ»Ñù¿ÉÒÔºÜÈÝÒ×µÄÀí½âÔ¶³Ì·þÎñ¡£ ´´½¨SOAP¿Í»§¶ËµÄ²¿·Ö¹¦ÄÜÊÇΪÁË´¦ÀíWSDLÎļþ¡£È»¶ø,Äã¿ÉÒÔÑÓ³Ù´¦ÀíWSDLÎļþÖ±µ½ÄãÐèÒª´¦ÀíÕâ¸öÎļþµÄʱºò¡£Ï¯ÃæÒ»¸ö´úÀíµÄÀý×Ó½«»áչʾԶ³Ì´úÀí·ÃÎÊSOAP·þÎñºÍÑÓ³ÙʵÀý»¯¡£
Ô¶³Ì´úÀí
Ê×ÏÈ,»ùÓÚPHP5·ç¸ñ, À´Ò»¶Î´´½¨¼òµ¥µÄSoapClient¶ÔÏóµÄ´úÂë¡£Äã±ØÐë±àÒëµÄʱºò¼ÓÉÏ—enable-soapÑ¡Ïî,²ÅÄÜʹÓÃSoapClientÀà,Èç¹ûÄãÒѾ×ö¹ýÁË,ÄÇôÄã¾Í¿ÉÒÔÓÃURLÐÎʽ,°ÑWSDLÎļþ´«Èë¹¹ÔìÆ÷À´´´½¨SoapClientʵÀý:
| // PHP5 $client=new SoapClient( ‘http://live¡£capescience¡£com/wsdl/GlobalWeather¡£wsdl’); |
×¢£ºPHP4·ç¸ñµÄSoapClients
ÔÚÄã±àÂëPHP4·ç¸ñµÄSOAP¿Í»§¶Ë֮ǰ,PHP5µÄ¼¼Êõ¿ÉÒÔºöÂÔ¡£PHP5 µÄSoapClientÊÇÒ»¸öÀ©Õ¹,ËùÒÔËüÊÇÔÉúµÄPHPµÄ´úÂë,Ëٶȸü¼Ó¿ì(Òë×¢:ÕâÀïµÄÔÉúPHP´úÂëÓ¦¸ÃÊÇÔÉú´úÂë,ÔÉú´úÂëÊÇÖ¸±àÒëÐÔÓïÑÔ±àдµÄ´úÂë),ʵ¼ÊÉÏÊÇÓÃCÓïÑÔÍê³É½âÎöºÍ¸ñʽ»¯XMLÐÅÏ¢µÄ¹¦ÄÜ¡£
PHP4·ç¸ñ SOAP¿â°üÀ¨:
| ? phpsoaptoolkit (http://phpsoaptoolkit¡£sf¡£net/phpsoap/), ? PEAR::SOAP (http://pear¡£php¡£net/package/SOAP) ? ez SOAP (http://ez¡£no/ez_publish/documentation/development/libraries/ez_soap) ? nusoap (http://sf¡£net/projects/nusoap/)¡£ |
ËùÓÐÕâЩphp4µÄ¿âÔÚ´¦ÀíÔ¶³ÌÐÅÏ¢µÄ¸ñʽ»¯ºÍ´«µÝµÄ¹¦ÄÜÊÇʹÓÃPHP´úÂëʵÏÖµÄ,²¢ÇÒÓÐÔ¶³Ì
´úÀíµÄÀý×Ó¡£
Ê×ÏÈÒ»¸öÎÊÌâÊÇÄãÓÃʲô·½·¨ÈÃSoapClient×ö»ØÓ¦? ÔËÐÐvar_dump(get_class_methods(get_class($client)));,Äã¿ÉÒÔºÜÈÝÒ×µÄÁоÙÔÚÔËÐÐʱµÄ·½·¨¡£ÐèÒª¸ü¼ÓÏêϸµÄÀý×ӵϰ,Äã¿ÉÒԲο¼ÏÂÃæµÄ²âÊÔ°¸Àý:
| class ProxyTestCase extends UnitTestCase { const WSDL=‘http://live¡£capescience¡£com/wsdl/GlobalWeather¡£wsdl’; private $client; function setUp() { $this->client=new SoapClient(ProxyTestCase::WSDL); } function TestMethodsOfSoapClient() { $soap_client_methods=array( ‘__construct’, ‘__call’, ‘__soapCall’, ‘__getLastRequest’, ‘__getLastResponse’, ‘__getLastRequestHeaders’, ‘__getLastResponseHeaders’, ‘__getFunctions’, ‘__getTypes’, ‘__doRequest’); $this->assertEqual( $soap_client_methods, get_class_methods(get_class($this->client))); } } |
Õ¦Ò»¿´,ËÆºõдÁËÒ»¸öûÓÐÓõIJâÊÔ,ÄѵÀÄãÖ»ÊÇΪÁËÔÚÈÎÒâʱºòÏÔʾÕâЩÐÅÏ¢¶øÒÑ?»òÐí°É,ÔÚPHPÉý¼¶µÄʱºò,Õâ¸ö²âÊÔ·ÅÈë³ÌÐò½øÐвâÊÔ¶ÔÓÚ¼àÊÓÄãµÄ³ÌÐò»áºÜÓÐÓÃ,±ÈÈç·¢ÏÖÓÐʲô·½·¨Ôö¼ÓÁË,»òÕßÊÇÄã¿ÉÒÔ·¢ÏÖÄÄЩ±»ÒÀÀµµÄ·½·¨±»É¾³ýÁË,ÑéÖ¤PHP±àÒëµÄʱºòÊÇ·ñ¼ÓÈëÁËSOAPÑ¡Ïî¡£µ«±ØÐëҪ˵µÄÊÇ,Õâ¸ö²âÊÔÊǼ«¶ËµÄ´àÈõ:ÆäÈõµã¾ÍÊÇ»áÒòΪ¸ü¸Ä´úÂëµÄÔÒò,ÐèÒªÖØ¹¹¶øÇҸ߶ÈÒÀÀµº¯ÊýÁбíµÄ˳Ðò¡£Ä¿Ç°,ËäÈ»Õâ¸ö²âÊÔÃèÊöÁËSoapClientÈçºÎ¹¤×÷,Èç¹ûÄãÏëÒª·ÅÒ»¸öÀàËÆµÄ²âÊÔ½øÐвâÊÔ,×îºÃ»¹ÊÇÖØ¹¹Ëü,ÓÃin_arrayº¯ÊýÀ´Ã÷È·µÄѰÕÒÄãÐèÒª²âÊԵĺ¯Êý¡£Äã¿ÉÒÔʹÓÃSoapClient::__getFunctions()·½·¨ºÜÈÝÒ×µÄÁ˽âÖ¸¶¨µÄSOAPÌṩʲô·þÎñ¡£ ÔÚGlobalWeather.wsdlµÄ°¸Àý,Äã¿ÉÒÔ°´ÕÕÏÂÃæ·½·¨×ö:
| class ProxyTestCase extends UnitTestCase { function TestSoapFunctions() { $globalweather_functions=array( ‘Station getStation(string $code)’, ‘boolean isValidCode(string $code)’, ‘ArrayOfstring listCountries()’, ‘ArrayOfStation searchByCode(string $code)’, ‘ArrayOfStation searchByCountry(string $country)’, ‘ArrayOfStation searchByName(string $name)’, ‘ArrayOfStation searchByRegion(string $region)’, ‘WeatherReport getWeatherReport(string $code)’ ); $this->assertEqual( $globalweather_functions, $this->client->__getFunctions()); } } |
SoapClient::__getFunctions()»á·µ»ØÒ»¸ö±íʾAPIµÄ×Ö·û´®Êý×鏸WEB·þÎñ¡£ÔÚÿ¸ö·½·¨ÖÐ,¶¼Óзµ»ØÀàÐÍ,·½·¨Ãû,²ÎÊýÀàÐͻᱻÁгöÀ´¡£(½¨ÒéÄãÔٴΰÑÉÏÃæÄÇÖÖ²âÊÔ·½·¨·ÅÈë³ÌÐòÖÐ,ÒÑ·¢²¼µÄweb·þÎñ,Èç¹û×öÁ˱ä¸ü½«Á¢¼´·¢³ö¾¯¸æ¡£Äã¿ÉÒÔÏëÏóÒ»ÏÂ,ÓÉÓÚAPIµÄ¸Ä±ä²úÉúÁËÒ»¸öbug,ÌìÆøÐÅÏ¢ºöȻֹͣÏÔʾÔÚÄãµÄÒ³Ãæ,¶øÄãÓÖûÓвì¾õµ½¡£Èç¹û×öÁËÕâÀàµÄ¼ì²é,Äã»á¿ìËٵĻñµÃÒò¸ü¸ÄAPI¶ø²úÉúµÄ¾¯¸æ¡£)
×îºóÈÃÎÒÃÇ¿´Ò»¸ö¼òµ¥µÄʵ¼ÊÀý×ÓÀ´Àí½âPHP5·ç¸ñµÄSoapClientÕâ¸ö·þÎñ¡£¼ÙÉèÓÐÕâÑùµÄÒ»¸öÀý×Ó,ÎÒÃÇÐèÒª²é¿´ÃÀ¹úÒÁÀûŵ˹ÖݵÄmolineµÄÌìÆø¡£Õâ¸ö»ñµÃµ±Ç°moline·É»ú³¡ÌìÆø×´Ì¬µÄ´úÂë³ÆÎª”KMLI”,ÐèÒªµ÷ÓÃgetWeatherReport()·½·¨ºÍ´«µÝ’KMLI’×Ö·û´®×÷Ϊ²ÎÊý¡£Õâ¸öµ÷Óý«·µ»ØÒ»¸öWeatherReport¶ÔÏó¡£
| class ProxyTestCase extends UnitTestCase { function TestGetWeatherReport() { $moline_weather=$this->client->getWeatherReport(‘KMLI’); $this->assertIsA($moline_weather, ‘stdClass’); } } |
ÒòΪWeatherReportʵ¼ÊÉϲ¢²»ÊÇÄã³ÌÐòÖж¨ÒåµÄÀà, SoapClient¶¼ÏóstdClassµÄʵÀý»¯Ò»ÑùµÄ·µ»ØËùÓеĶÔÏó¡£ÕâʱÄãÒ²¿ÉÒÔ»ñµÃ·µ»Ø¶ÔÏóµÄÊôÐÔµÄÖµ¡£
|
class ProxyTestCase extends UnitTestCase { |
| class ProxyTestCase extends UnitTestCase { function TestGetWeatherReport() { // continued ¡£¡£¡£ $temp=$moline_weather->temperature; $temperature_tests=array( ‘ambient’=> ‘Float’ ,’dewpoint’=> ‘Float’ ,’relative_humidity’=> ‘Integer’ ,’string’=> ‘String’ ); foreach($temperature_tests as $key=> $isa) { $this->assertIsA($temp->$key, $isa, “$key should be $isa, actually [%s]”); } } } |
ÉÏÃæµÄ·½·¨Êä³öµÄʵ¼ÊЧ¹ûÈçÏÂ:
|
stdClass Object |
ÏÖÔÚÄã»ù±¾ÕÆÎÕÁËPHP5·ç¸ñµÄSoapClient(ÈçºÎ×öÒ»¸öÔ¶³Ì´úÀí),µ«ÊÇÄãÔõô²ÅÄÜдһ¸öÑÓ³ÙʵÀý»¯µÄ´úÀí¸øSoapClientÄØ?
| class GlobalWeather { private $client; // ‘Station getStation(string $code)’, public function getStation($code) { return $this->client->getStation($code); } } |
getStation()¿ÉÒÔ´úÀí$client±äÁ¿Ö¸ÏòµÄgetStation()·½·¨¡£²»¹ÜÈçºÎ,´ÓÕâµãÉÏ¿´, SoapClientʵÀý²¢Ã»Óд´½¨,ҲûÓд洢µ½$client±äÁ¿,ÒòΪÉÏÃæÒÑ˵¹ý,¶ÔWSDLÎļþ½øÐÐÔ¶³Ì´¦ÀíÓ¦¸ÃÑÓ³Ùµ½ÕæÕýÐèÒªµÄʱºò¡£
Äã¿ÉÒÔÔÚ²åÈëÒ»¶ÎÑÓ³Ù¼ÓÔØµÄ´úÂë֮ǰ×öÒ»ÏÂclientµÄµ÷ÓÃ,À´ÑÓ³ÙSoapClientµÄʵÀý»¯
| class GlobalWeather { private $client; private function lazyLoad() { if (! $this->client instanceof SoapClient) { $this->client=new SoapClient( ‘http://live¡£capescience¡£com/wsdl/GlobalWeather¡£wsdl’); } } // ‘Station getStation(string $code)’, public function getStation($code) { $this->lazyLoad(); return $this->client->getStation($code); } } |
lazyLoad()Öд´½¨SoapClient¶ÔÏóÊÇÒ»¶¨ÒªµÄ¡£ÕâÀï´æÔÚÒ»¸öÎÊÌâ:Èç¹ûÎÒÊÇÒ»¸öÀÁ¶èµÄ±àÂëÕß,ÈÃÎҷdz£²»Ë¬ÊÇ:ÎÒ²»µÃ²»ÔÚËùÓеĴúÀí·½·¨ÖмÓÈë$this->lazyLoad();¡£Óиü¼Ó¼ò±ãµÄ·½·¨Âð?µ±È»ÓÐ,ÖØÐ´Ò»±é°É,ʹÓÃPHP5еÄÌØÐÔÀ´·µ»Ø¶ÔÏ󡣸ÄlazyLoad()µÄÃû×ÖΪclient(),²¢ÔÚÕâ¸ö·½·¨ÀïÃæÊµÀý»¯$client,´úÀíÖеķ½·¨·ÃÎÊclient()·½·¨ÓÅÓÚ·ÃÎÊ$clientÊôÐÔ¡£°ÑÑÓ³ÙʵÀý»¯×öµÄ¸ü¼Ó¼òµ¥!
| class GlobalWeather { private function client() { if (! $this->client instanceof SoapClient) { $this->client=new SoapClient( ‘http://live¡£capescience¡£com/wsdl/GlobalWeather¡£wsdl’); } return $this->client; } // ¡£¡£¡£ // ‘boolean isValidCode(string $code) public function isValidCode($code) { return $this->client()->isValidCode($code); } // and so on for other SOAP service methods ¡£¡£¡£ // ‘WeatherReport getWeatherReport(string $code) public function getWeatherReport($code) { return $this->client()->getWeatherReport($code); } } |
ÄãÃÔÉÏGlobalWeather·þÎñµÄÑÓ³ÙʵÀý´úÀíÀàÁËÂð?ÄãÓÐÒ»¸öÀà¿ÉÒÔÔÚÈκÎʱ¼äÔÚÄãµÄ³ÌÐòÀïÃæ´´½¨,²¢ÇÒÔÚ²»ÐèÒªËüÃǵÄʱºò¾Í²»½âÎöµÄÔ¶³Ì×ÊÔ´¡£Ê¹ÓôúÀíÀ໹ÓÐÁíÍâÒ»¸öÓÅÊÆ:ʹÓôúÀí¿ÉÒÔÁоÙSOAPËùÖ§³ÖµÄ·½·¨,ÄãÏÖÔھͿÉÒÔ¶ÔÕâ¸öÀà½øÐвâÊÔ¡£
×¢£ºÑÓ³Ù´úÀí¿ÉÑÓ³ÙÒì³£
ÔÚPHP5Àï,´´½¨Ò»¸ö¶ÔÏó»á²úÉúÒ»¸öÒì³£¡£Ê¹ÓÃÑÓ³ÙʵÀý»¯´úÀí,Äã¿ÉÒÔÑÓ³ÙÕâ¸öDZÔÚµÄÒì³£Ö±µ½µÚÒ»´ÎʹÓ÷½·¨´´½¨¶ÔÏóµÄʱºò¡£¡£(Äã¿ÉÒÔÊÔÊÔÓôúÀíÍê³ÉÕâ¸ö¹¦ÄÜ¡£)ÕâÃ÷ÏÔ²»ÊÇ´úÀíģʽµÄÖØµã,µ«ÊÇÍùÍùÓÐһЩÊÂÇé,ÄãÐèÒª¼Çס¡£
¶¯Ì¬´úÀí
PHP5ÌṩһЩºÜºÃµÄÌØÐÔ,¿ÉÒÔ¿ìËٵķâ×°Ò»¸ö´úÀíÀà¶ø²»ÓÃÃ÷È·µÄд³öÿһ¸ö·½·¨¡£
| class GenericProxy { protected $subject; public function __construct($subject) { $this->subject=$subject; } public function __call($method, $args) { return call_user_func_array( array($this->subject, $method), $args); } } |
ÕâÀïµÄ¹Ø¼üÊÇ_call()·½·¨(ͨ¹ýEXPERIMENTALÀ©Õ¹ÖØÔØ,ͬÑù¿ÉÓÃÓÚPHP4)¡£´úÀíÀàÖеÄ_call·½·¨ÔÊÐíÄãͨ¹ý$subject´úÌæµÄ·½Ê½À´Öض¨Òåÿ¸öµ÷Óá£ÓÉÓÚ__call()±ÈÆäËû·½·¨µÄÓÅÏȼ¶±ð¶¼µÍ,Äã¿ÉÒÔÔÚ´úÀíÀàÖж¨ÒåÒ»¸ö·½·¨,ÈÃ__call()À´´úÌæÖ´ÐÐ,ÓÚÊÇÄã¿ÉÒÔ¼ÓÒ»Ð©ÌØ±ðµÄÐèÇóµ½ÄãʹÓõĴúÀíģʽ¡£
×ܽá
´úÀíģʽÔںܶàÇé¿ö϶¼·Ç³£ÓÐÓÃ,ÌØ±ðÊÇÄãÏëÇ¿ÐпØÖÆÒ»¸ö¶ÔÏóµÄʱºò,±ÈÈç:ÑÓ³Ù¼ÓÔØ,¼àÊÓ״̬±ä¸üµÄ·½·¨µÈµÈ¡£ÕâÕÂͨ¹ý¿ª·¢GlobalWeatherÀà×öʾ·¶,ÒÔºóÄãÒ²¿ÉÒÔʹÓôúÀíģʽÔÚÄãµÄ±¾µØ¼ÆËã»úÉÏʹÓÃÔ¶³Ì×ÊÔ´:
¶¯Ì¬´úÀíÔÚ±àд´úÂëµÄʱºò·Ç³£¼òµ¥,Òò´Ë¿ÉÒԺܿìËÙºÍÈÝÒ×µÄʵÏÖÔÚÄãµÄ³ÌÐòÖС£È»¶ø(ËùÓеÄʵÏÖ¶¼ÒÀÀµ__call()·½·¨),·´Éä²¢²»ÄÜÔÚ¶ÔÏóÄÚ²¿¾ß±¸ÕâÑùµÄ¿É¼ûÐÔ(Òë×¢:·´ÉäÒ»°ãÊÇÔÚ²»Á˽âÀàµÄÄÚ²¿Çé¿öϲÙ×÷µÄ)¡£ÔÚÌØÊâÇé¿öÏÂ,Èç¹ûÄãʹÓÃÒ»¸ö´úÀí¾ÍÐèÒªÒ»¸ö½Ó¿Ú,Äã²»ÄÜÀÏÊÇÒÀÀµÓÚ__call()·½·¨,ÖÁÉÙ±ØÐë±àÂëµÄʱºò,Ó¦¸Ã°Ñ½Ó¿ÚËùÓеķ½·¨ºÜÃ÷È·µÄдÈëÄãµÄ´úÀíÀà¡£
ÒÔÉÏËù·ÖÏíµÄÊǹØÓÚ¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚʮһÕ ´úÀíģʽ£¬ÏÂÃæÊDZà¼ÎªÄãÍÆ¼öµÄÓмÛÖµµÄÓû§»¥¶¯£º
¡¡¡¡Ïà¹ØÎÊÌ⣺¡¾phpÃæÊÔÌâ¡¿Çëд³öphp´úÀíģʽµÄα´úÂë
¡¡¡¡´ð£ºÐ¡°×²»¶®ÌâÄ¿µÄÒâ˼£¬ÄѵÀÊÇαÔìCURLÀ´Ô´IP£¿ ²»¹ýαÔìIPµ¹Ò²ÊDZØÐëÓôúÀí ±ÈÈ磺 curl_setopt($curl, CURLOPT_PROXY, "http://116.236.216.116:8080/"); >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺javaÉè¼ÆÄ£Ê½Ö®´úÀíģʽ£º
¡¡¡¡´ð£ººÜ¼òµ¥£º¶ÔÍⲿÌṩͳһµÄ½Ó¿Ú·½·¨£¬¶ø´úÀíÀàÔÚ½Ó¿ÚÖÐʵÏÖ¶ÔÕæÊµÀàµÄ¸½¼Ó²Ù×÷ÐÐΪ£¬´Ó¶ø¿ÉÒÔÔÚ²»Ó°ÏìÍⲿµ÷ÓÃÇé¿öÏ£¬½øÐÐϵͳÀ©Õ¹¡£Ò²¾ÍÊÇ˵£¬ÎÒÒªÐÞ¸ÄÕæÊµ½ÇÉ«µÄ²Ù×÷µÄʱºò£¬¾¡Á¿²»ÒªÐÞ¸ÄËû£¬¶øÊÇÔÚÍⲿÔÚ¡°°ü¡±Ò»²ã½øÐи½¼ÓÐÐΪ£¬¼´´úÀíÀà¡£ Àý... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺php ίÍÐģʽºÍ´úÀíÄ£Ê½Çø±ð
¡¡¡¡´ð£ºÇø±ðÈçÏ£º 1¡¢Î¯ÍÐģʽÊǰѶà¸ö²»Í¬¶ÔÏóίÍÐÓɵ¥Ò»¸öίÍжÔÏóÀ´Í³Ò»Ö´ÐС£±£³Ö½Ó¿Ú½»Á÷µÄ¶ÔÏóÖ»Óв»±äµÄͬһ¸ö£¬´úÂëÒ²²»±ä¡£ ´úÀíģʽÊǰÑÄѸ´ÖƵġ¢Õ¼×ÊÔ´¶àµÄ¡¢Ô¶³ÌËÙ¶ÈÂýµÄ¶ÔÏ󡣸÷×Ô¶ÔÓ¦Ò»¸ö´úÀí¶ÔÏ󣬱»´úÀíºó½øÐб¾µØµÄ²Ù×÷¡£ >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
