2016-05-23 10 views
0

Gibt es Unterschiede zwischenReturn Objektinstanz mit aktuellem Zustand

$this->state = $state; 
return $this; 

und

$instance = clone $this; 
$instance->state = $state; 
return $instance; 

Kontext:

class TestCase { 

    /** 
    * State 
    */ 
    private $state; 

    /** 
    * Set state 
    */ 
    function setState($state) { 
     $this->state = $state; 
     return $this; 
     // Or 
     // $instance = clone $this; 
     // $instance->state = $state; 
     // return $instance; 
    } 

} 
$test = new TestCase; 
$test->setState($state1)->setState($state2); 
+0

was meinst du Unterschied, man ist $ das der andere ist ein Klon von $ this. Klon ist wie eine Kopie, es ist ein Duplikat. Wenn du meinst, der Wert ist der gleiche, naja das ist was eine Kopie ist ein Duplikat, wenn du eine Datei kopierst und sie umbenennst ist der Inhalt gleich ... Ja, bis sie divergieren. Wenn Sie dieses 'spl_object_hash' überprüfen, sind sie nicht dasselbe. – ArtisticPhoenix

+0

Der einzige Unterschied in Ihrem Beispiel wäre in der zweiten, wenn Sie niemals den Status auf das Original und nur auf den Klon anwenden, dann sind sie offensichtlich auseinander gegangen. Es ist, als würde man die Datei bearbeiten und dann die kopierte Datei bearbeiten, ohne das Original zu ändern. Sie werden zu zwei separaten verschiedenen Entitäten, wenn sie geklont werden. – ArtisticPhoenix

+0

@ArtisiticPhoenix Ich habe gerade den Kontext hinzugefügt, in dem ich bin. Danke für Ihre schnellen Antworten. – MinhTri

Antwort

0

als Beispiel, wenn Sie dies tun

$test = new TestCase; 
$test->setState(1)->setState(2); 

$test->getState(); 

was dann Klon werden Sie keine verwenden, ist die Antwort, weil $test ist das ursprüngliche Objekt, das hatte eigentlich nie hat es Zustand gesetzt. Die anderen 2 Klone werden am Ende der Methodenkette verworfen.

Die Kette Verfahren kann den richtigen Wert zurück, aber wenn Sie die Obect $test in einen anderen Bereich übernehmen, wie

function a(){ 
     $this->test = new TestCase; 
     $this->test->setState(1)->setState(2); 
} 

function b(){ 
    echo $this->test->setState(3); 
} 

Dann hat Test nie über die anderen zwei Staaten bekannt ist, wie ich einige ist es, sagte was sinnlos.

Normalerweise möchten Sie ein Objekt klonen, wenn Sie es nach dem Setzen eines Anfangswerts forkieren. Ein Beispiel wäre wie eine Query Builder sein, in dem Sie die Abfrage erstellen und es dann klonen eine separate Abfrage zu tun, um die Ergebnisse (minus eine Grenze oder um zum Beispiel) zählen

$Qb = new QueryBuilder(); 
$Qb->select('*')->table('posts')->where('published', '<', '2014-02-20'); 

    //copy and diverge to count results, 
$tQb = clone $Qb; 
$tQb->select('COUNT(id) AS total'); 
$total = $tQb->getResult(); 

    // add limits to original instance. 
$Qb->limit('20'); 
$rows = $Qb->getResult(); 

Siehe Klonen verwendet werden würde, zu retten Einrichten des ersten Teils der Abfrage, dann kopieren und divergieren Sie sie für die individuellen Bedürfnisse. Eins um die Gesamtergebnisse zu zählen, um eine begrenzte Anzahl von Ergebnissen zu ziehen. Das ist nützlich, wenn Sie mehrere Joins und mehrere Teile für die Where-Klausel etc. hatten.

0

Wenn ich mich nicht irre, werden beim Klonen zwei verschiedene Objekte erzeugt.

+0

Ich würde nicht anders sagen, da der Klon die Kopie ist, also ist es das gleiche Objekt mit dem gleichen Zustand wie das Original, aber eine separate Instanz von diesem Punkt an. – ArtisticPhoenix

+0

Danke! Nein, ich möchte nur eine aktuelle Objektinstanz mit dem aktuellen Status zurückgeben. – MinhTri

Verwandte Themen