PHP的深層複製
当需要在JavaScript中进行深拷贝时,我想起在PHP中实现深拷贝时的繁琐,因此做下这个备忘录(同样也是为了JavaScript做备忘录)。
PHP是一种流行的服务器端脚本语言,适用于Web开发和动态网页制作。
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $object1;
public $object2;
function __clone()
{
// this->object のコピーを作成します。こうしないと、
// 同じオブジェクトを指すことになってしまいます。
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("元のオブジェクト\n");
print_r($obj);
print("クローンオブジェクト\n");
print_r($obj2);
在PHP中,当我们尝试对对象进行深拷贝时,由于使用clone语句只能进行浅拷贝,因此对于对象内的引用类型,我们需要按照官方提供的代码样例实现__clone方法并使用clone语句。然而,如果该对象内部还存在其他引用类型的情况,我们还需分别实现__clone方法进行拷贝,这使得操作非常繁琐。
完成找到解决方法后才发现以下方式非常方便,无需做任何操作。
$new_object = unserialize(serialize($object));
使用unserialize函数时需要注意以下事项。
不要直接将用户输入传递给unserialize()函数。
将外部来源的值传递给PHP的unserialize函数会导致安全漏洞的产生。
JavaScript
JavaScript
- jQueryを使う
var object = {省略};
var newObject = {};
$.extend(true, newObject, object);
// ObjectとArrayにのみ対応
- lodash.jsを使う
var object = {省略};
var newObject = _.clone(object, true);
var object = {省略};
var newObject = _.cloneDeep(object);
- JSONでのシリアライズは完全ではないようです
请参考以下链接:
http://qiita.com/seihmd/items/74fa9792d05278a2e898
http://qiita.com/knhr__/items/d7de463bf9013d5d3dc0