【问题标题】:Why keyword 'clone' in PHP not working as expected? Internal arrays为什么 PHP 中的关键字“克隆”不能按预期工作?内部数组
【发布时间】:2018-12-03 13:15:32
【问题描述】:

我在一个类中有一个方法可以从一个数组中复制一个对象并将其放入另一个数组中,我使用克隆来避免修改原始对象的可能性。这是代码:

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;

如果你执行它,你会得到这个:

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
                                )

                        )

                )

        )

)

修改“ONLY_MODIFY_THIS”会影响几个对象,而应该只影响第一个对象。

我想要两件事:

  1. 保留原始对象 D1、D2 和 D3

  2. 仅修改 finals 数组中索引的对象。

【问题讨论】:

  • why its not working as spected 我认为你没有提到你期望它做什么,它没有做什么?
  • @JonStirling 我修改了代码,你理解我的问题,我相信内部数组有问题..
  • 老实说,TL;DR。如果您可以将该代码简化为演示问题所需的最小示例,这将很有帮助。
  • @deceze 原来的代码很小而且在最上面,下面的代码是对象$c的print_r
  • 这仍然是 5 个类来包装一个人。一定有一个比这更简单的例子。

标签: php class copy clone copy-constructor


【解决方案1】:

来自文档[1]:

|当一个对象被克隆时,PHP 5 将执行一个浅拷贝 |对象的所有属性。

这与 PHP 7 相同(将立即解决这个小问题)。 您正在寻找深层副本。

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

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多