zero-config/克隆

执行对象的深度克隆。

1.1.0 2018-03-15 21:03 UTC

This package is auto-updated.

Last update: 2024-08-29 04:20:09 UTC


README

“zero-config/clone”包旨在支持开发者创建对象的深度克隆。与大多数解决方案不同,此包确实做到了它所说的,并且不需要了解其内部工作原理或特定配置即可完成预期的操作。🐑

Bitbucket Pipelines codecov Packagist PHP from Packagist Packagist

安装

composer require --dev zero-config/clone

用法

要使用克隆功能,只需调用deepClone函数。或者,可以使用别名🐑

<?php
/** @var object $original */
$copy = deepClone($original);
$copy = 🐑($original);

对于面向对象的方法,可以使用Cloner的实例。

<?php
use ZeroConfig\Cloner\Cloner;

/** @var object $original */
$cloner = new Cloner();
$copy   = $cloner($original);

要点

  1. 对象递归地克隆。
  2. 克隆所有可见性(公共、受保护、私有)的属性。
  3. 静态属性不会克隆。
  4. 单例保持单例状态。
  5. 关系保持不变。克隆兄弟之间的引用也将相互引用。
  6. 当对象对相互引用时,克隆不会导致递归错误。

概念验证

克隆器创建对象的深度副本,识别引用并能够正确处理递归自引用。

<?php
// Define the timezone for Holland and Amsterdam during winter.
$winter = new stdClass();
$winter->amsterdam = new stdClass();
// Holland inherits from Amsterdam.
$winter->holland = $winter->amsterdam;

// Set the timezone offset for Amsterdam.
$winter->amsterdam->offset = '+1';

// Create a deep clone of the timezone to set the summer configuration.
$summer = 🐑($winter);

// Set the offset for Holland.
$summer->holland->offset = '+2';

echo json_encode(
    [
        'winter' => $winter,
        'summer' => $summer
    ],
    JSON_PRETTY_PRINT
) . PHP_EOL;

上面的代码将输出

{
    "winter": {
        "amsterdam": {
            "offset": "+1"
        },
        "holland": {
            "offset": "+1"
        }
    },
    "summer": {
        "amsterdam": {
            "offset": "+2"
        },
        "holland": {
            "offset": "+2"
        }
    }
}

这证明了hollandamsterdam都是相同的对象,在执行深度复制时,amsterdamholland都不会影响原始时区的子对象,但它们仍然指向同一个对象。

这是通过检查给定的对象是否已有克隆,并在可用时重用克隆来实现的。