page contents

php的对象传值与引用传值,可能有些人还搞不明白

以下内容希望帮助到大家!

attachments-2020-06-UaloEB6o5ef2aaa01df1d.png

变量赋值与对象赋值对比

<?php 
    // 声明一个变量并赋值 
    $a = 1; 
    // 将数据类型的值 赋值 给一个变量 
    $b = $a; 

    // 修改$a的值 
    $a = 2; 

    // $a和$b是两个独立的内存空间修改其中一个另一个不受影响
    echo $b; // 1 

    class Person{
        public $name;
        public $age;

    }

    // 将对象类型的数据 赋值 给一个变量
    $p = new Person;

    // 通过对属性修改值,来确定面向对象中 对象的传值方式
    $p->name = 'jesse';

    // 若是成功修改值,则是引用传值 
    echo $p->name; // jesse

?>

案例解释:

在这里通过变量的赋值方式与对象的赋值方式方式相对比,代码中 $b = $a; 的赋值方式为“拷贝赋值”,故在修改其源值($a的值)的情况下,$b的值不受影响。$a与$b的内存关系图如下:

v2-17c39c02be31d34c149709d8039e153f_720w.jpg


而代码 $p->name = 'jesse';将数据类型赋值给$p变量,通过$p修改对象内部的值成功,对比变量的传值方式,证明这是引用传值,内存关系图如下:

v2-b0ba50c5927296d10e4c80c8af63467b_720w.jpg

<?php 
    class Person
    {
        public $name;
        public $age;

        // 将对象类型的数据 赋值 给一个变量
        $p = new Person;

        // 通过对属性修改值,来确定面向对象中 对象的传值方式
        $p->name = 'jesse';

        // 将对象赋予另一变量
        $m = $p;

        // 另一变量修改属性值
        $m->name = 'Marry';

        // 输出源变量 赋值变量访问内部属性的结果
        echo $p->name, $m->name;
    }

?>

$m = $p;代码为本篇文章的最“点睛”的代码,等号右边为是一个对象,左边是一个变量,那么犀利的问题来了,$m是将对象拷贝一份?还是按引用传递呢?该代码内存关系如下:

v2-b8ccb2afb5b39255716a4b5a44fc819c_720w.jpg

所以,最后两个对象的属性值均被修改为Marry!!!

那按引用传值会是怎么个情况?

<?php 
    class Person
    {
        public $name; 
        public $age; 
    } 

    // 将对象类型的数据 赋值 给一个变量 
    $p = new Person; 

    // 通过对属性修改值,来确定面向对象中 对象的传值方式
    $p->name = 'jesse';

    // 将对象赋予另一变量
    $m = &$p;

    // 另一变量修改属性值
    $m->name = 'Marry';

    // 输出源变量 赋值变量访问内部属性的结果
    echo $p->name, $m->name;

?>

v2-2c678996fe4dedb31f8f2eb5a2e088fd_720w.jpg


attachments-2020-06-clIc7M6S5ef2aa8e4246c.jpg

  • 发表于 2020-06-24 09:21
  • 阅读 ( 447 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1482 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章