按引用传递函数参数问题 本帖最后由 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 所占空间 apache解析问题 麻烦帮看看是哪里错了啊 在php页面中为什么get方法传递中文参数会出错? 为何simplexml_load_file读取远程失败后不能自行退出 刚开始学php 弱弱的问一下 flash+php+mysql获取返回值的问题 请教大学php编程时通常的规范 这个是什么回事啊,高分请教:) 在win平台的服务器下如何用php实现自动发信? 那有支持 php、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 所占空间