dongyi1939 2018-12-03 13:15
浏览 110

为什么PHP中的关键字'clone'无法按预期工作? 内部数组

I have a method in a class that copy an object from an array and put it into another, I use clone to avoid the possibility to modify the original object. This is the code:

class I {
  public $name;
  public $value;

  public function __construct( $name, $value )
  {
    $this->name = $name;
    $this->value = $value;
  }
}

class D {
  public $name;
  public $items;
  public function __construct( $name )
  {
    $this->name = $name;
    $this->items = array(
      'I1' => new I( "I1", 1232 ),
      'I2' => new I( "I2", 12 ),
      'I3' => new I( "I3", "hello" )
    );
  }

  public function addItem( Item $item )
  {
    array_push( $this->items, $item );
  }
}

class B {
  public $values; 
  public function __construct()
  {
    $this->values = array(
      "D1" => new D("D1"), 
      "D2" => new D("D2"), 
      "D3" => new D("D3"));
  }   
}

class A {
  public $name;
  public $bobject;
  public $finals;  
  public function __construct()
  {
    $this->bobject = new B();
    $this->finals = array();
  }
  public function addFinal( $name )
  {
    $final = clone $this->bobject->values[$name];
    array_push( $this->finals, $final );
  }
}

class C extends A {

}


$c = new C();
$c->addFinal( "D1" );
$c->addFinal( "D1" );
$c->addFinal( "D1" );
$c->addFinal( "D1" );
$c->addFinal( "D2" );
$c->addFinal( "D3" );
$c->addFinal( "D1" );

$c->finals[0]->name = "HelloWorld";
$c->finals[0]->items["I1"]->name="ONLY_MODIFY_THIS";

print_r( $c );
exit;

If you execute it you will get this:

genial\C Object
(
    [name] => 
    [bobject] => genial\B Object
        (
            [values] => Array
                (
                    [D1] => genial\D Object
                        (
                            [name] => D1
                            [items] => Array
                                (
                                    [I1] => genial\I Object
                                        (
                                            [name] => ONLY_MODIFY_THIS
                                            [value] => 1232
                                        )

                                    [I2] => genial\I Object
                                        (
                                            [name] => I2
                                            [value] => 12
                                        )

                                    [I3] => genial\I Object
                                        (
                                            [name] => I3
                                            [value] => hello
                                        )

                                )

                        )

                    [D2] => genial\D Object
                        (
                            [name] => D2
                            [items] => Array
                                (
                                    [I1] => genial\I Object
                                        (
                                            [name] => I1
                                            [value] => 1232
                                        )

                                    [I2] => genial\I Object
                                        (
                                            [name] => I2
                                            [value] => 12
                                        )

                                    [I3] => genial\I Object
                                        (
                                            [name] => I3
                                            [value] => hello
                                        )

                                )

                        )

                    [D3] => genial\D Object
                        (
                            [name] => D3
                            [items] => Array
                                (
                                    [I1] => genial\I Object
                                        (
                                            [name] => I1
                                            [value] => 1232
                                        )

                                    [I2] => genial\I Object
                                        (
                                            [name] => I2
                                            [value] => 12
                                        )

                                    [I3] => genial\I Object
                                        (
                                            [name] => I3
                                            [value] => hello
                                        )

                                )

                        )

                )

        )

    [finals] => Array
        (
            [0] => genial\D Object
                (
                    [name] => HelloWorld
                    [items] => Array
                        (
                            [I1] => genial\I Object
                                (
                                    [name] => ONLY_MODIFY_THIS
                                    [value] => 1232
                                )

                            [I2] => genial\I Object
                                (
                                    [name] => I2
                                    [value] => 12
                                )

                            [I3] => genial\I Object
                                (
                                    [name] => I3
                                    [value] => hello
                                )

                        )

                )

            [1] => genial\D Object
                (
                    [name] => D1
                    [items] => Array
                        (
                            [I1] => genial\I Object
                                (
                                    [name] => ONLY_MODIFY_THIS
                                    [value] => 1232
                                )

                            [I2] => genial\I Object
                                (
                                    [name] => I2
                                    [value] => 12
                                )

                            [I3] => genial\I Object
                                (
                                    [name] => I3
                                    [value] => hello
                                )

                        )

                )

            [2] => genial\D Object
                (
                    [name] => D1
                    [items] => Array
                        (
                            [I1] => genial\I Object
                                (
                                    [name] => ONLY_MODIFY_THIS
                                    [value] => 1232
                                )

                            [I2] => genial\I Object
                                (
                                    [name] => I2
                                    [value] => 12
                                )

                            [I3] => genial\I Object
                                (
                                    [name] => I3
                                    [value] => hello
                                )

                        )

                )

            [3] => genial\D Object
                (
                    [name] => D1
                    [items] => Array
                        (
                            [I1] => genial\I Object
                                (
                                    [name] => ONLY_MODIFY_THIS
                                    [value] => 1232
                                )

                            [I2] => genial\I Object
                                (
                                    [name] => I2
                                    [value] => 12
                                )

                            [I3] => genial\I Object
                                (
                                    [name] => I3
                                    [value] => hello
                                )

                        )

                )

            [4] => genial\D Object
                (
                    [name] => D2
                    [items] => Array
                        (
                            [I1] => genial\I Object
                                (
                                    [name] => I1
                                    [value] => 1232
                                )

                            [I2] => genial\I Object
                                (
                                    [name] => I2
                                    [value] => 12
                                )

                            [I3] => genial\I Object
                                (
                                    [name] => I3
                                    [value] => hello
                                )

                        )

                )

            [5] => genial\D Object
                (
                    [name] => D3
                    [items] => Array
                        (
                            [I1] => genial\I Object
                                (
                                    [name] => I1
                                    [value] => 1232
                                )

                            [I2] => genial\I Object
                                (
                                    [name] => I2
                                    [value] => 12
                                )

                            [I3] => genial\I Object
                                (
                                    [name] => I3
                                    [value] => hello
                                )

                        )

                )

            [6] => genial\D Object
                (
                    [name] => D1
                    [items] => Array
                        (
                            [I1] => genial\I Object
                                (
                                    [name] => ONLY_MODIFY_THIS
                                    [value] => 1232
                                )

                            [I2] => genial\I Object
                                (
                                    [name] => I2
                                    [value] => 12
                                )

                            [I3] => genial\I Object
                                (
                                    [name] => I3
                                    [value] => hello
                                )

                        )

                )

        )

)

The modification "ONLY_MODIFY_THIS" affects several objects, when is supposed to affect only the first.

I want two things:

  1. Preserve original objects D1, D2 and D3

  2. Modify only the object indexed in the finals array.

  • 写回答

1条回答 默认 最新

  • doumo1807831 2018-12-03 21:46
    关注

    From the docs[1]:

    | When an object is cloned, PHP 5 will perform a shallow copy of | all of the object's properties.

    This is the same for PHP 7 (will fix this minor issue right away). You are looking for a deep copy.

    [1] http://php.net/manual/en/language.oop5.cloning.php

    评论

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样