代码之家  ›  专栏  ›  技术社区  ›  acm

如何复制一个没有引用的对象?

  •  30
  • acm  · 技术社区  · 14 年前

    有很好的文件证明PHP5 OOP objects are passed by reference 默认情况下。如果这是默认的,在我看来有一个没有默认的方式复制没有参考,如何??

    function refObj($object){
        foreach($object as &$o){
            $o = 'this will change to ' . $o;
        }
    
        return $object;
    }
    
    $obj = new StdClass;
    $obj->x = 'x';
    $obj->y = 'y';
    
    $x = $obj;
    
    print_r($x)
    // object(stdClass)#1 (3) {
    //   ["x"]=> string(1) "x"
    //   ["y"]=> string(1) "y"
    // }
    
    // $obj = refObj($obj); // no need to do this because
    refObj($obj); // $obj is passed by reference
    
    print_r($x)
    // object(stdClass)#1 (3) {
    //   ["x"]=> string(1) "this will change to x"
    //   ["y"]=> string(1) "this will change to y"
    // }
    

    $x 原汁原味 $obj like this

    2 回复  |  直到 7 年前
        1
  •  52
  •   Treffynnon    14 年前
    <?php
    $x = clone($obj);
    

    所以应该是这样的:

    <?php
    function refObj($object){
        foreach($object as &$o){
            $o = 'this will change to ' . $o;
        }
    
        return $object;
    }
    
    $obj = new StdClass;
    $obj->x = 'x';
    $obj->y = 'y';
    
    $x = clone($obj);
    
    print_r($x)
    
    refObj($obj); // $obj is passed by reference
    
    print_r($x)
    
        2
  •  24
  •   lonesomeday    14 年前

    object cloning .

    要在示例中执行此操作,请执行以下操作:

    $x = clone $obj;
    

    clone 使用行为 __clone()