注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

shally

笑看庭前花开花落

 
 
 

日志

 
 

PHPRPC引用参数传递  

2011-07-06 10:38:26|  分类: phprpc |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
引用参数传递
PHPRPC 客户端在通过方法名直接调用服务器端的方法时,是不采用引用参数传递的,原因在于远程过程调用跟本地过程调用的引用参数传递从本质上是不一样的。对于本地过程调用的引用参数传递,实际上是传递参数的地址(指针),这样本地过程才可能修改引用参数的值(不是修改它的地址指针)。因为本地引用参数传递是通过指针来实现的,所以这种调用的开销大部分情况下甚至比值传递还要低。而远程过程调用时,就完全不是这样了,我们不可能传递一个本地数据的指针到远端去,因为在远端服务器上的同一个内存地址上是找不到我们的本地数据的。因此,远程过程调用的参数传递,一定是将本地数据的值通过某种方式序列化后传递到远端的,也就是值传递,那么要想实现类似于本地过程调用中引用参数传递的效果(就是可以修改参数值),那么就要将服务器端修改后的参数的值也已某种方式序列化后再传回到本地。因此远程过程调用中的引用参数传递要比值传递的开销还要大。这也是在 PHPRPC 客户端实现中默认不采用引用参数传递的原因。
要想使用引用参数传递也不难,但这需要用 invoke 方法来调用远程服务。我们来看一个例子。假设我们的服务器端是用 PHP 发布了一个 PHP 内置的对数组排序的函数 sort,下面是我们在客户端对它的调用:
view plain copy to clipboard print ?
<?php  
include  ( "php/phprpc_client.php" );  
$client  =  new  PHPRPC_Client( 'http://127.0.0.1/server.php' );  
$fruits  =  array ( "lemon" ,  "orange" ,  "banana" ,  "apple" );  
$args  =  array (& $fruits , SORT_STRING);  
print_r($fruits );  
$client ->invoke( 'sort' ,  $args , true);  
print_r($fruits );  
?>  
<?php  include ("php/phprpc_client.php");  $client = new PHPRPC_Client('http://127.0.0.1/server.php');  $fruits = array("lemon", "orange", "banana", "apple");  $args = array(&$fruits, SORT_STRING);  print_r($fruits);  $client->invoke('sort', $args, true);  print_r($fruits);  ?>  
执行后,我们会看到如下结果:
Array
(
[0] => lemon
[1] => orange
[2] => banana
[3] => apple
)
Array
(
[0] => apple
[1] => banana
[2] => lemon
[3] => orange
)
很好,它成功了。
这里我们要看到需要注意的三点:
第一,invoke 方法的第二个参数是一个引用参数,因此它必须是一个变量,所以我们不可以写成:
$client ->invoke( 'sort' ,  array (& $fruits , SORT_STRING), true);  
$client->invoke('sort', array(&$fruits, SORT_STRING), true);  
否则,你会得到类似于这样的错误信息:
Fatal error: Cannot pass parameter 2 by reference in ...


第二,如果在给
$args
赋值时,
$fruits
如果不是一个引用的话,那么
invoke
调用后
print_r($fruits);
你并不会看到改变后的值,但如果你
print_r($args);
时,会发现 $args 的第一个元素仍然被改变了,也就是说,引用参数传递还是成功了。
第三,也是最重要的一点,invoke 的第三个参数,就是觉得是否引用参数传递的关键,如果它是 true,就是引用参数传递,如果它是 false,就是值传递。该参数的默认值是 false。也就是说,对于非引用参数传递的远程过程,你也可以使用 invoke 来进行调用,只是看上去不那么直观。但是当你真正需要通过字符串表示的方法名来调用远程方法时,它就是你最好的选择了。

本文选自:http://blog.csdn.net/xuejiazhi/article/details/6231005

  评论这张
 
阅读(569)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017