Frage

Es scheint, dass durch Bezugnahme in PHP-Objekten übergeben werden. Auch Zuweisungsoperator erscheinen keine Kopie des Objekts zu erzeugen.

Hier ist ein einfacher, gekünstelt Beweis:

<?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'

?>

In beiden Druck Fällen erhalte ich 'nach'

Also, wie gehe ich $ a set_b () von Wert, die nicht mit Hilfe?

War es hilfreich?

Lösung

In PHP 5 + Objekte werden als Referenz übergeben. In PHP 4 werden sie von Wert übergeben (das ist, warum es Runtime-Pass von Referenz hatte, die veraltet wurde).

Sie können den 'Klon' Operator in PHP5 verwenden, um Objekte zu kopieren:

$objectB = clone $objectA;

Außerdem ist es nur Objekte, die als Referenz übergeben werden, nicht alles so, wie Sie in Ihrer Frage gesagt haben ...

Andere Tipps

Die Antworten werden in Java Büchern häufig zu finden.

  1. Klonen: Wenn Sie nicht Klon-Methode überschreiben, ist das Standardverhalten flache Kopie. Wenn Ihre Objekte nur primitive Membervariablen haben, ist es völlig in Ordnung. Aber in einer typenlos Sprache mit einem anderen Objekt als Member-Variablen, dann ist es ein Geduldsspiel.

  2. Serialisierung / Deserialisierung

$new_object = unserialize(serialize($your_object))

Damit wird erreicht, tiefe Kopie mit einem hoch Kosten auf der Komplexität des Objekts abhängig.

Nach vorherigem Kommentar, wenn Sie ein anderes Objekt als Member-Variable hat, gehen Sie folgendermaßen vor:

class MyClass {
  private $someObject;

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

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

}

Jetzt können Sie tun das Klonen:

$bar = new MyClass();
$foo = clone $bar;

Nach der Dokumentation ( http://ca3.php.net/language.oop5. Klonen ):

$a = clone $b;

Nur um klären PHP kopieren verwenden beim Schreiben, so dass im Grunde alles ist eine Referenz, bis Sie es ändern, aber für Objekte müssen Sie Klon verwenden und die __clone () magische Methode wie in der akzeptierten Antwort.

Dieser Code Hilfe Klon Methoden

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

ich tat einige Tests und bekam dies:     

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

?>

In diesem Beispiel werden wir schaffen iPhone Klasse und exakte Kopie machen von diesem durch Klonen

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

Wenn Sie möchten, vollständig in einer anderen Instanz kopieren Eigenschaften eines Objekts, können Sie diese Technik verwenden möchten:

serialisiert es zu JSON und dann deserialisieren es auf Objekt zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top