黑马程序员技术交流社区

标题: 【黑马程序员济南】PHP课程同步笔记day21:对象的传值方式 [打印本页]

作者: 小鲁哥哥    时间: 2017-7-18 11:20
标题: 【黑马程序员济南】PHP课程同步笔记day21:对象的传值方式
本帖最后由 小鲁哥哥 于 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也跟着改变,这里就证明他们是引用传递

其内存图为下图:



作者: jingxian90    时间: 2017-7-18 15:09
焦哥厉害! 这么多种传值方式,受教了!
作者: cz_liu    时间: 2017-11-16 21:40
代码写错了吧    值传递的时候怎么用上了引用传递了
证明代码那里 第7行




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2