PHP 对象的浅复制(shallow copy)

文章目录

    上周遇到一个低级的 bug,半天没有找到问题所在,今天在蹲坑的时候,不知道为何脑子中想起了这个 bug,
    然后突然意识到是否是因为没有进行对象 clone 造成的。

    果然,问题就是因为在多次遍历同一个 laravel collection 时,反复对同一个对象的属性进行操作,导致后面的操作覆盖了之前的操作,所以在最终返回结果时,只保留了最后一次的操作结果。

    浅复制(shallow copy)

    $copy_of_object = clone $object;

    来做一个测试

    <?php
    
    class City {
        public $name;
    }
    
    $c1 = new City;
    $c1->name = "烟台";
    
    echo $c1->name;    // 烟台
    echo PHP_EOL;
    
    $c2 = $c1;
    echo $c2->name;   // 烟台
    echo PHP_EOL;
    
    $c1->name = "威海";
    echo $c2->name;   // 威海
    echo PHP_EOL;
    
    $c3 = clone $c1;
    echo $c3->name;  // 威海
    echo PHP_EOL;
    
    $c1->name = "青岛";
    echo $c3->name;  // 威海
    echo PHP_EOL;
    

    测试结果

    php /tmp/test.php
    烟台
    烟台
    威海
    威海
    威海
    

    为何称之为浅复制呢?

    与之对应的是深复制。因为浅复制情况下,对象的属性如果还是对象的话,该属性还是指向同一个对象。

    参考

    https://www.php.net/manual/zh/language.oop5.cloning.php

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式