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