如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

上一篇文章里面,苏南大叔刚刚说过了普通的php数组是不需要clone关键字的。但是,这一篇文章里面,苏南大叔就要继续说明php数组克隆的方案,是不是有些前后言语不一致呢。这里苏南大叔澄清一下,本文中的数组,也是特殊的数组,即数组中的某个元素是object的情况。本文中的数组克隆的案例,剧情更加扑朔迷离。欲知详情,请继续查看本文中的内容。

基本逻辑描述

再次强调一下,本文中的数组,并非是普通的常见php数组,数组中的某个元素是个object。数组定义如下:

class test {
    public $b;
    public function __construct($v) {
        $this->b = $v;
    }
}
$b1 = [["初始值a", "b", "c"], new test("初始值b")];
// ...
// 这个位置将会出现一系列的数组clone方案,但是其中有些是正确的,有些是错误的。
// ...
$b1[0][0] = "修改值aa";
$b1[1]->b = "修改值bb";
// ...
// 一系列数组clone方案中,到底谁对谁错呢?
// ...
b1
Array
(
    [0] => Array
        (
            [0] => 修改值aa
            [1] => b
            [2] => c
        )

    [1] => test Object
        (
            [b] => 修改值bb
        )
)

正确的方案

判断正确的标准,就是修改原版的数组后,克隆的数组并不发生变化。以这个标准看的话,以下是正确的方案。

$b2 = array_copy($b1);
$b3 = unserialize(serialize($b1));
$b4 = json_decode(json_encode($b1));

其中的自定义函数array_copy定义如下:

newsn.net:这里是【评论】可见内容

php数组克隆方案对比大全 - 369

php数组克隆方案对比大全(图2-1)

错误的方案

这些错误的方案,也是流传于网上的,经过实践,证明是有问题的。大家可以引以为戒。

$b5 = $b1;
$b6 = array_merge([], $b1);
$b7 = (array)$b1;
$b8 = new ArrayObject($b1);
$b9 = array_map(function ($object) {
    return clone $object;
}, $b1);

其中最后一个方案$b9,如果数组中不出现普通的元素的话,还是可以的。但是,一但出现了普通的原生变量元素。就直接报错了。Uncaught Error: __clone method called on non-object

php数组克隆方案对比大全 - 374

php数组克隆方案对比大全(图2-2)

至于其它的错误方案,苏南大叔这里就不截图了。大家可以自行脑补会得到什么样的答案。

newsn.net:这里是【评论】可见内容

结论

只要涉及到object的克隆,都应该时刻警觉。因为很有可能,事情的走势已经偏离了你的轨道。

更多苏南大叔编写的php相关经验文章,请点击这里查看。

  【php】秘籍文章入口,仅传授于有缘之人  php    clone

欢迎转载传播本篇原创文章,转载请保留链接及作者信息。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

苏南大叔需要你的支持

打赏任意金额,发送截图到邮箱 shang@newsn.net ,可以领取精选回馈如下(任选其一):
  • 《前端视频教程大礼包》一套
  • 《wordpress精选皮肤》一套
  • 《dedecms织梦精选模板》一套
感谢您的打赏,让我更有动力,将更多精彩教程文章,呈现给大家!谢谢!

岁月静好

关注互联网发展,关注苏南大叔的《程序如此灵动~》博客
本文章来自:程序如此灵动~
博客地址为:https://newsn.net/
原文地址为:https://newsn.net/say/php-clone-array.html
上一篇好文:php如何使用clone关键字克隆class实例化对象
下一篇好文:未知php代码分析,堆栈打印函数总结

如果您转载了本文章,出于某种原因,并没有注明作者或者出处。
在这里,苏南大叔也表示理解和支持。因为苏南大叔深深地明白:
您会在合适的时机,合适的地方,给本博客一个外链。对吧?
您若开心,便是安好!岁月静好,但愿世界和平,没有纷争~