php 파싱 - PHP에서 객체의 복사본을 만드는 방법은 무엇입니까?




5 Answers

PHP 5 이상에서는 객체가 참조로 전달됩니다. PHP 4에서는 값으로 전달됩니다 (참조로 런타임 패스가 사용되지 않으므로 사용되지 않습니다).

PHP5에서 'clone'연산자를 사용하여 객체를 복사 할 수 있습니다.

$objectB = clone $objectA;

또한 참조로 전달되는 객체 일 뿐이며 질문에서 말한 모든 것이 아닙니다 ...

데이터 가져

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'

?>

두 가지 인쇄 사례 모두에서 '후'

그래서, 어떻게 참조로 아닌 값으로 set_b ()$ a 전달합니까?




이전 메모에 따르면 다른 개체가 멤버 변수로 있으면 다음을 수행하십시오.

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;



PHP는 copy on write를 사용하기 때문에 수정하기 전까지는 기본적으로 모든 것이 참조가되지만, 객체의 경우 복제와 __clone () 매직 메소드를 사용하는 데 필요한 대답은 허용됩니다.




나는 약간의 테스트를하고 있었고 이것을 얻었다 :

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" }

?>



다른 인스턴스에서 개체의 속성을 완전히 복사하려면이 방법을 사용하는 것이 좋습니다.

JSON에 serialize 한 다음 Object로 역 직렬화합니다.




Related