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

广告
将在 10 秒后关闭
bannerAds