按引用传递函数参数问题 本帖最后由 klend 于 2011-04-15 10:57:16 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果测试的话 建议 index.html 文件在200k以上 <?php$c = 1;function c($a){ $f = $a; //变量未分离,$f和$a都指向的同一个zval,只是zval的refcount+1 //$f = 3;//变量分离,内存重新为$f分配了一个zval,如果你取消这一行注释,结果会和a函数一致 echo memory_get_usage();}function a( &$a){ $f = $a;//变量分离,内存重新为$f分配了一个zval echo memory_get_usage();}$c = 1;c( $c );echo "<br/>";a( $c );?> 你是怎么理解的呢?首先了解下php变量的分解和引用机制,这里有篇文章写的简单易懂,你看看http://www.laruence.com/2008/09/19/520.html 理解参考/** * 非引用函数传递,内存只分配了空间存储变量名,而它们对应的zval结构体并没有重新分配 * zval结构体是存变量名对应的值,共用计数(refount),引用计数(is_ref)等.. */$x = 1;//相当于function($y)$y = $x; //refcount=2,is_ref=0echo debug_zval_dump($y)."<br/>";//refcount = 2,is_ref=0,debug_zval_dump函数调用会有一次变量分离,所以显示refcount为3$n = $y;echo debug_zval_dump($n)."<br/>";//refcount = 3,is_ref=0/** * 引用函数传递,内存即分配了空间存储变量名,又因为变量进行了分离,从而分配了新的空间存储新的zval. */$x = 1;//相当于function(&$t)$t = &$x;//refcount=1,is_ref=1$m = $t;//变量分离,内存就为$m变量分配了一个存储变量名'm'的空间,以及其对应的zval结构体echo debug_zval_dump($m)."<br/>";//refcount = 1,is_ref=0,debug_zval_dump函数调用会有一次变量分离,所以显示refcount为2 echo memory_get_usage() .'<br />';function foo($v) { $t = $v; echo memory_get_usage() .'<br />'; unset($t); echo memory_get_usage() .'<br />';}$s = str_pad('a', 1024);echo memory_get_usage() .'<br />';foo($s);foo(&$s);343888344928345200345200346240345200 补充说明344928-343888 = 1040 为变量 $s 所占空间传引用346240-345200 = 1040 为赋值给 $t 时 $t 所占空间 看了昨天一个人的问题,我也变得想不通了 请问这个字符串符合json标准格式吗? excel表数据上传到数据库 请教大家??? 请推荐一个影视下载的系统 在apache+php中启用XSLT出错 我的php传递不了参数。大家帮帮忙。 文件点击统计 这是不是restful风格? mysql输出不全 请问用PHP的CURL模拟POST提交相关参数设置问题 PHP提交的时候要对留言框进行非法字符判断
$c = 1;
function c($a)
{
$f = $a; //变量未分离,$f和$a都指向的同一个zval,只是zval的refcount+1
//$f = 3;//变量分离,内存重新为$f分配了一个zval,如果你取消这一行注释,结果会和a函数一致
echo memory_get_usage();
}
function a( &$a)
{
$f = $a;//变量分离,内存重新为$f分配了一个zval
echo memory_get_usage();
}
$c = 1;
c( $c );
echo "<br/>";
a( $c );
?>
首先了解下php变量的分解和引用机制,这里有篇文章写的简单易懂,你看看
http://www.laruence.com/2008/09/19/520.html
* 非引用函数传递,内存只分配了空间存储变量名,而它们对应的zval结构体并没有重新分配
* zval结构体是存变量名对应的值,共用计数(refount),引用计数(is_ref)等..
*/
$x = 1;
//相当于function($y)
$y = $x; //refcount=2,is_ref=0
echo debug_zval_dump($y)."<br/>";//refcount = 2,is_ref=0,debug_zval_dump函数调用会有一次变量分离,所以显示refcount为3
$n = $y;
echo debug_zval_dump($n)."<br/>";//refcount = 3,is_ref=0/**
* 引用函数传递,内存即分配了空间存储变量名,又因为变量进行了分离,从而分配了新的空间存储新的zval.
*/
$x = 1;
//相当于function(&$t)
$t = &$x;//refcount=1,is_ref=1
$m = $t;//变量分离,内存就为$m变量分配了一个存储变量名'm'的空间,以及其对应的zval结构体
echo debug_zval_dump($m)."<br/>";//refcount = 1,is_ref=0,debug_zval_dump函数调用会有一次变量分离,所以显示refcount为2
$t = $v;
echo memory_get_usage() .'<br />';
unset($t);
echo memory_get_usage() .'<br />';
}$s = str_pad('a', 1024);echo memory_get_usage() .'<br />';foo($s);
foo(&$s);
343888
344928
345200
345200
346240
345200
344928-343888 = 1040 为变量 $s 所占空间传引用
346240-345200 = 1040 为赋值给 $t 时 $t 所占空间