문제

그것은 나타나는 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;

또한, 그것은 당신이 당신의 질문에서 말한 것처럼 모든 것이 아니라 참조로 통과되는 객체 일뿐입니다 ...

다른 팁

답은 일반적으로 Java Books에서 발견됩니다.

  1. 클로닝 : 복제 방법을 무시하지 않으면 기본 동작은 얕은 사본입니다. 객체에 원시 멤버 변수 만 있으면 완전히 괜찮습니다. 그러나 멤버 변수로서 다른 객체를 가진 유형이없는 언어에서는 두통입니다.

  2. 직렬화/사막화

$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 사용하여 복사에 쓰기 때문에 기본적으로 모든 것을 참조할 때까지 당신은 그것을 수정하지만,당신은 당신이 무엇을 선택 사용할 필요가 복제 및__복제()마술과 같은 방법에서 허용된 대답이다.

이 코드는 복제 방법에 도움이됩니다

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으로 직렬화 한 다음 다시 객체로 다시 해제하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top