189

PHPでは、オブジェクトは参照によって渡されるようです。代入演算子でさえ、オブジェクトのコピーを作成しているようには見えません。

簡単で工夫された証拠は次のとおりです。

<?php

class A {
    public $b;
}


function set_b($obj) { $obj->b = "after"; }

$a = new A();
$a->b = "before";
$c = $a; //i would especially expect this to create a copy.

set_b($a);

print $a->b; //i would expect this to show 'before'
print $c->b; //i would ESPECIALLY expect this to show 'before'

?>

どちらの印刷の場合でも、「後」になります

では、参照ではなく値で$ aset_b()に渡すにはどうすればよいですか?

4

9 に答える 9

317

PHP 5 以降では、オブジェクトは参照によって渡されます。PHP 4 では、それらは値によって渡されます (そのため、非推奨になった実行時の参照渡しがありました)。

オブジェクトをコピーするには、PHP5 で「clone」演算子を使用できます。

$objectB = clone $objectA;

また、参照によって渡されるのは単なるオブジェクトであり、質問で述べたすべてのものではありません...

于 2008-10-09T04:24:09.790 に答える
117

答えは、一般的に Java の本に記載されています。

  1. クローン作成: クローン メソッドをオーバーライドしない場合、デフォルトの動作は浅いコピーです。オブジェクトにプリミティブ メンバー変数しかない場合は、まったく問題ありません。しかし、メンバー変数として別のオブジェクトを持つ型のない言語では、それは頭痛の種です。

  2. シリアライゼーション/デシリアライゼーション

$new_object = unserialize(serialize($your_object))

これにより、オブジェクトの複雑さに応じてコストのかかるディープ コピーが実現されます。

于 2008-10-09T05:28:54.947 に答える
25

前のコメントによると、メンバー変数として別のオブジェクトがある場合は、次のようにします。

class MyClass {
  private $someObject;

  public function __construct() {
    $this->someObject = new SomeClass();
  }

  public function __clone() {
    $this->someObject = clone $this->someObject;
  }

}

これでクローンを作成できます:

$bar = new MyClass();
$foo = clone $bar;
于 2008-10-09T06:53:07.820 に答える
11

ドキュメントによると ( http://ca3.php.net/language.oop5.cloning ):

$a = clone $b;
于 2008-10-09T04:23:05.157 に答える
1

このコードはメソッドの複製に役立ちます

class Foo{

    private $run=10;
    public $foo=array(2,array(2,8));
    public function hoo(){return 5;}


    public function __clone(){

        $this->boo=function(){$this->hoo();};

    }
}
$obj=new Foo;

$news=  clone $obj;
var_dump($news->hoo());
于 2013-10-03T20:25:32.220 に答える
1

私はいくつかのテストを行っていて、これを得ました:

class A {
  public $property;
}

function set_property($obj) {
  $obj->property = "after";
  var_dump($obj);
}

$a = new A();
$a->property = "before";

// Creates a new Object from $a. Like "new A();"
$b = new $a;
// Makes a Copy of var $a, not referenced.
$c = clone $a;

set_property($a);
// object(A)#1 (1) { ["property"]=> string(5) "after" }

var_dump($a); // Because function set_property get by reference
// object(A)#1 (1) { ["property"]=> string(5) "after" }
var_dump($b);
// object(A)#2 (1) { ["property"]=> NULL }
var_dump($c);
// object(A)#3 (1) { ["property"]=> string(6) "before" }

// Now creates a new obj A and passes to the function by clone (will copied)
$d = new A();
$d->property = "before";

set_property(clone $d); // A new variable was created from $d, and not made a reference
// object(A)#5 (1) { ["property"]=> string(5) "after" }

var_dump($d);
// object(A)#4 (1) { ["property"]=> string(6) "before" }

?>
于 2014-01-23T19:29:00.943 に答える
-1

オブジェクトのプロパティを別のインスタンスに完全にコピーする場合は、次の手法を使用できます。

それを JSON にシリアライズしてから、デシリアライズして Object に戻します。

于 2013-08-20T14:00:47.727 に答える