2016-10-21 5 views
2

Ich möchte eine Methode mit der Elternfunktion von sich selbst verketten.PHP-Kette mit Parent-Funktion

Beispiel:

class Query 
{ 
    protected $limit; 

    /** 
    * Returns some third object that isn't in this family. 
    * This object represents the results, and also has 
    * a first function that gets called in a chain. 
    */ 
    public function get() 
    { 
     // Do Stuff 

     return new /* ... */; 
    } 

    public function take($amount) 
    { 
     $this->limit = $amount; 

     return $this; 
    } 
} 

class ChildQuery extends Query 
{ 
    protected $singular = false; 

    public function get() 
    { 
     if($this->singular) 
      return $this->take(1)->parent::get()->first(); 

     return parent::get() 
    } 

    public function singular() 
    { 
     $this->singular = true; 

     return $this; 
    } 
} 

Dies ist natürlich nicht der volle Satz von Funktionen, noch funktioniert, aber Sie bekommen die Idee. Ich möchte ChildQuery::get in der Lage sein, Query::get in einer Kette aufzurufen.

Gerade jetzt, ich habe dies zu tun:

public function get() 
{ 
    $this->take(1); 

    parent::get()->first(); 
} 

, die nicht für mich ist ansprechend. Irgendwelche Ideen?

Ich führe PHP 7, wenn es darauf ankommt.

Mein Endergebnis würde wie folgt aussehen:

$query->singular()->get(); // ($query is a ChildQuery) 

Antwort

1

Es ist einfach nicht möglich, eine übergeordnete Methode durch die öffentliche Schnittstelle eines Objekts zu nennen (auch wenn es die gleiche Klasse/Objekt wie die aktuelle Kontext). Bitte werfen Sie auch einen Blick auf https://stackoverflow.com/a/11828729/2833639.

Meiner Meinung nach ist Ihre Lösung der richtige Weg.

Off Topic: Ich empfehle, https://ocramius.github.io/blog/fluent-interfaces-are-evil/ zu lesen, um zu bewerten, ob eine flüssige Schnittstelle für Ihren Anwendungsfall gut ist.

+0

Das ist ein Mist. –

+1

Auch verwende ich nicht immer Fluent APIs, aber es gibt Zeiten, in denen sie super bequem sind, wie Abfragen (sogar Ihre verwandten Artikel suggeriert dies). –