PHP에서 오브젝트 복사본을 만들려면 어떻게 해야 하나요?
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'
?>
두 인쇄 케이스 모두 '추격'을 받고 있습니다.
그럼 어떻게 하면 $a를 참조가 아닌 값으로 set_b()에 전달할 수 있을까요?
PHP 5+에서는 오브젝트가 참조로 전달됩니다.PHP 4에서는 이러한 값은 값으로 전달됩니다(그래서 런타임에 참조가 전달되어 더 이상 사용되지 않게 되었습니다.
PHP5의 '복제' 연산자를 사용하여 개체를 복사할 수 있습니다.
$objectB = clone $objectA;
또한, 그것은 당신이 질문에서 말한 모든 것이 아니라 참조에 의해 전달되는 물체입니다.
정답은 자바 책에서 흔히 볼 수 있습니다.
클로닝:복제 방법을 재정의하지 않으면 기본 동작은 얕은 복사입니다.객체에 원시 멤버 변수만 있는 경우에는 완전히 문제가 없습니다.하지만 다른 오브젝트를 멤버 변수로 하는 타입 없는 언어에서는 골칫거리입니다.
시리얼화/디시리얼화
$new_object = unserialize(serialize($your_object))
이렇게 하면 개체의 복잡성에 따라 비용이 많이 들고 딥 복사가 가능합니다.
이전 코멘트에 따르면 다른 오브젝트가 멤버 변수로 있는 경우 다음 작업을 수행합니다.
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;
문서(http://ca3.php.net/language.oop5.cloning)에 따르면
$a = clone $b;
PHP는 Copy on Write를 사용하기 때문에 기본적으로는 수정할 때까지 모든 것이 참조입니다.단, 오브젝트의 경우 클론 및 __clone() 매직 메서드를 사용해야 합니다.
이 코드는 메서드 복제에 도움이 됩니다.
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());
몇 가지 테스트를 하고 있는데 이걸 받았어요.
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" }
?>
이 예에서는, iPhone 클래스를 작성해, 클로닝에 의해서 정확하게 카피를 작성합니다.
class iPhone
{
public $name;
public $email;
public function __construct($n, $e) {
$this->name = $n;
$this->email = $e;
}
}
$main = new iPhone('Dark', 'm@m.com');
$copy = clone $main;
// if you want to print both objects, just write this
echo "<pre>"; print_r($main); echo "</pre>";
echo "<pre>"; print_r($copy); echo "</pre>";
다른 인스턴스에 있는 객체의 속성을 완전히 복사하려면 다음 방법을 사용할 수 있습니다.
이를 JSON에 시리얼화한 후 오브젝트에 다시 시리얼화합니다.
언급URL : https://stackoverflow.com/questions/185934/how-do-i-create-a-copy-of-an-object-in-php
'programing' 카테고리의 다른 글
MariaDB - 두 json 객체 비교 (0) | 2022.12.19 |
---|---|
문자, 디지털 문자, 특수 문자 없이 단어와 일치시키기 위해 정규 표현을 어떻게 사용하는가? (0) | 2022.12.19 |
명령줄에서 .jar 파일을 추출하는 중 (0) | 2022.12.19 |
기본 연결된 프로그램으로 파일을 여는 방법 (0) | 2022.12.19 |
C 데이터형은 어떻게 "대부분의 컴퓨터에서 직접 지원"됩니까? (0) | 2022.12.19 |