{
xdebug_debug_zval('a');
}
function func($b)
{
func2($b);
debug_zval_dump($b);
xdebug_debug_zval('b');
$b = 1;
xdebug_debug_zval('b');
}
$a = array(1);
$a= '2';
xdebug_debug_zval('a');
func($a);
$b = &$a;
xdebug_debug_zval('b');
$b = 2;
xdebug_debug_zval('b');
class A{
};
$aa = new A();
xdebug_debug_zval('aa');
输出
a: (refcount=1, is_ref=0)='2'
a: (refcount=5, is_ref=0)='2'
string(1) "2" refcount(4)
b: (refcount=3, is_ref=0)='2'
b: (refcount=1, is_ref=0)=1
b: (refcount=2, is_ref=1)='2'
b: (refcount=2, is_ref=1)=2
aa: (refcount=1, is_ref=0)=class A { }
注意一次函数调用引用计数+2
猜想:新建临时变量 新建函数内部变量 总共两次 实际情况 因为 php 函数参数传递都是可变参数形式(参考c标准库可变参数原理) zend_parse_parameters 有两次赋值过程
弱语言 所有函数 都是可变参数