本帖最后由 小鲁哥哥 于 2017-7-18 11:30 编辑
【黑马程序员济南】PHP课程同步笔记day21:对象的传值方式
对象的传值方式
看看对象传值的情形:分为两种值传递和引用传递
值传递: 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 [PHP] 纯文本查看 复制代码 /*传智播客济南校区*/
class A{
var $p1 = 1;
}
$a1 = new A();
$a2 = $a1;
$a2->p1 = 11;
echo $a1->p1;
输出结果为:11
引用传递: 所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。 [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也跟着改变,这里就证明他们是引用传递
其内存图为下图:
|