2017-03-05 8 views
1

sagen, dass ich die folgende Klasse haben:Rückgabe von Funktionswerten bei Verwendung der Methodenverkettung in PHP?

class Test 
{ 

    private static $instance = false; 

    public static function test() 
    { 
     if(!self::$instance) 
     { 
      self::$instance = new self(); 
     } 
     return self::$instance; 
    } 

    public function test1() 
    { 
     //... 
    } 

    public function test2() 
    { 
     //... 
    } 

} 

Und ich gehe über den Aufruf von Funktionen, indem sie wie so Verkettungs:

$data = Test::test(...)->test1(...)->test2(...); 

Im Moment für das obige Verfahren Kette Ich habe zu halten, um Arbeit wieder aufnehmen $instance und ich würde es wirklich gerne, wenn ich etwas von test2() zurückgeben könnte, um dann $data zugeordnet werden, aber ich bin mir nicht sicher, wie dies zu tun, wie ich $instance zurückgeben muss, damit mt-Methode Kette funktioniert?

+1

Sie werden entscheiden müssen: Entweder Sie zurückkommen, das Objekt, so dass Sie eine Kette oder Sie geben einen Wert zurück. Du kannst beides nicht wirklich machen. – jeroen

Antwort

1

Wenn Sie Methoden verketten wollen, müssen Sie die aktuelle Instanz von jeder Methode zurückgeben, an die ein anderer Aufruf angedockt ist. Es ist jedoch nicht notwendig, dass der letzte Anruf in der Kette dies tut. In diesem Fall bedeutet das, dass Sie zurückgeben können, was auch immer Sie möchten.

Denken Sie daran, wenn Sie etwas anderes als test2() zurückgeben, können Sie in Zukunft nichts mehr daran ketten. Zum Beispiel würde $data = Test::test(...)->test2(...)->test1(...); nicht funktionieren.
Protip: Es lohnt sich, den Code mit einigen Kommentaren zu dokumentieren, die erklären, welche nicht verkettbar sind und nicht in Zukunft vergessen werden.

0

return $this innerhalb test1() und test2() Methoden.

1

Im Allgemeinen, wenn Sie Methoden verketten, und ich nehme an, dass jeder der obigen Tests Ihr Datenmodell in einem anderen Zustand zurückgibt, und ich nehme an, dass Sie einige Daten aus dem Modell selbst möchten. Ich würde folgendes tun:

class Test 
{ 
    private static $model; 

    public function test1() { 
     //do something to model 
     return $this; 
    } 

    public function test1() { 
     //do something to model 
     return $this; 
    } 

    public function finish_process() { 
     //process results 
     return $this.model; 
    } 
} 

so im Wesentlichen kann ich das jetzt folgendes tun:

$results = Test::test1()->finish_process(); 

und

$results = Test::test1()->test2()->finish_process(); 
1

Sie die $ Daten durch seine Referenz zu übergeben und Sie können ändern es oder weisen Sie ihm irgendwelche Daten zu.

// inside class 

public function test2(&$data) { 
    $data = 'it will work'; 
} 

// outside class 
$data = ''; 
Test::test(...)->test1(...)->test2($data); 

Kontrolle dieses http://php.net/manual/en/language.references.pass.php

Verwandte Themen