执行对象的深度克隆。
1.1.0
2018-03-15 21:03 UTC
Requires
- php: ^7.2
Requires (Dev)
- mediact/testing-suite: @stable
This package is auto-updated.
Last update: 2024-08-29 04:20:09 UTC
README
“zero-config/clone”包旨在支持开发者创建对象的深度克隆。与大多数解决方案不同,此包确实做到了它所说的,并且不需要了解其内部工作原理或特定配置即可完成预期的操作。🐑
安装
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);
要点
- 对象递归地克隆。
- 克隆所有可见性(公共、受保护、私有)的属性。
- 静态属性不会克隆。
- 单例保持单例状态。
- 关系保持不变。克隆兄弟之间的引用也将相互引用。
- 当对象对相互引用时,克隆不会导致递归错误。
概念验证
克隆器创建对象的深度副本,识别引用并能够正确处理递归自引用。
<?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"
}
}
}
这证明了holland和amsterdam都是相同的对象,在执行深度复制时,amsterdam和holland都不会影响原始时区的子对象,但它们仍然指向同一个对象。
这是通过检查给定的对象是否已有克隆,并在可用时重用克隆来实现的。