引用传递:
所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
[PHP] 纯文本查看 复制代码
/*传智播客济南校区*/
class B{
var $p1 = 1;
}
$b1 = new B();
$b2 = &$b1;
$b2->p1 = 11;
echo $b1->p1;
输出结果为:11
在这种情况下:引用传递和值传递得到的结果是一样的!
为什么会这样呐?
一个变量存储了对象信息,其在内存结构中,是如下的方式:
$a1 = new A();
其内存结构形式如下:
即:一个对象变量内部,实际存储的其实是该对象的"编号",由该编号,才指向对象数据本身;
我们在语法上,既无法改变编号,也无法控制编号,而是只能通过对象使用形式(->)来对该编号指向对象进行操作。
语句值传递类似这样:
$a2 = $a1; //值传递
引用传递类似这样:
$b1 = new B();
$b2 = & $b1; //引用传递
证明:
[PHP] 纯文本查看 复制代码
/*传智播客济南校区*/
class A{
var $p1 = 1;
}
$a1 = new A();
$a2 = &$a1;
class B{
var $p1 = 1;
}
$b1 = new B();
$b2 = &$b1;
$a1 = 100; //随意给其赋一个值
$b1 = 100; //随意给其赋一个值
echo "<br />";var_dump($a1);
echo "<br />";var_dump($a2);
echo "<br />";var_dump($b1);
echo "<br />";var_dump($b2);
输出结果:
int(100)
object(A)#1 (1) {["p1"]=>int(11)}
int(100)
int(100)
a1改变,a2不改变,这里就证明他们是值传递
b1改变,b2也跟着改变,这里就证明他们是引用传递
其内存图为下图: