对象在内存中的存在形式,函数传递内存方式
class Persion
{
public $name;
public $age;
}
$a = new Persion();
$a->name = "小白";
$a->age = "8";
//此处传的是$a的地址
$b = $a;
//都输出小白
echo $a->name."
";
echo $b->name."
";
$a = 78;
//$b对应的是$a的地址,改变了$b也就是改变了$a
$b = &$a;
$b = $b + 8;
//$a和$b均等于86
echo $a.'|'.$b."
";
$p = new Persion();
$p->nmae = "小刚";
$p->age = 23;
//如果给一个函数传递一个值,实际上是传递的地址,数据的改变则地址所对应的值也改变
function test($p)
{
$p->name = "小明";
}
//函数的调用,开辟了一个新的栈,函数调用完成则栈关闭
test($p);
//输出小明
echo $p->name;
?>
在以上代码中:
(1)$a对应内存地址,假设是0x123,($a和地址存放在栈区,相当于我们查字典时的索引);
(2)通过内存地址的索引,找到堆区。堆区里面存放着”小白“,”8“等数据
(3)$b = $a,实际上是将$a的内存地址0x123传给$b,堆区里的属性$name,$age不变,也就是不会再重新复制一份。当改变$b->name时,$a->name的值会改变。
内存图: