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



Answers

대답은 일반적으로 자바 서적에서 찾을 수 있습니다.

  1. 복제 : 복제 방법을 재정의하지 않으면 기본 동작은 단순 복사입니다. 객체에 프리미티브 멤버 변수 만 있으면 완전히 괜찮습니다. 그러나 멤버 변수로 다른 객체를 가진 typeless 언어에서는 두통입니다.

  2. 직렬화 / 직렬화 해제

$new_object = unserialize(serialize($your_object))

이렇게하면 오브젝트의 복잡성에 따라 많은 비용이 드는 딥 카피가 가능합니다.

Question

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 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());



이 예제에서 우리는 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>";






Related