Fluent Interface

Eigene Bewertung: Nichts Durchschnitt: 5 (1 Bewertung)

Fluent Interfaces (fließende Schnittstellen) haben nichts mit den seit PHP5 bekannten Interfaces zu tun, so viel vorne weg.
Hinter diesem Begriff birgt sich die Möglichkeit aufeinander folgende Methodenaufrufe einer Klasse zu verketten. Dies erspart einerseits redundanten Code (wenn auch minimal) und erhöht zudem die Lesbarkeit. Ermöglicht wird dieses Vorgehen dadurch, indem die Methoden $this, also die eigene Instanz zurückgeben. Dies ist natürlich nur dann möglich, wenn es sich um Methoden handelt, welche sonst keinen Rückgabewert, also void zurückgeben (zum Beispiel Set-Methoden).

Klasse ohne Fluent Interface

Als Beispiel eine einfache Klasse ohne konkrete Implementierung zum Versenden einer Email.

class Mail {
 
  private $_to;
 
  private $_subject;
 
  private $_message;
 
  public function setTo($to) {
    $this->_to = $to;
  }
 
  public function setSubject($subject) {
    $this->_subject = $subject;
  }
 
  public function setMessage($message) {
    $this->_message = $message;
  }
 
  public function send() {
    return mail($this->_to, $this->_subject, $this->_message);
  }
}

Klasse mit Fluent Interface

Die gleiche Klasse nun unter der Verwendung des Fluent Interface was sich lediglich in der Rückgabe der eigenen Instanz in den Setter-Methoden auswirkt.

class MailFluent {
 
  private $_to;
 
  private $_subject;
 
  private $_message;
 
  public function setTo($to) {
    $this->_to = $to;
 
    return $this; // Rückgabe der eigenen Instanz
  }
 
  public function setSubject($subject) {
    $this->_subject = $subject;
 
    return $this;
  }
 
  public function setMessage($message) {
    $this->_message = $message;
 
    return $this;
  }
 
  public function send() {
    return mail($this->_to, $this->_subject, $this->_message);
  }
}

Anwendung

Nun der Aufruf der beiden vorangegangen Beispiele.

// ohne Fluent Interface
$mail = new Mail();
$mail->setTo('mail@example.com');
$mail->setSubject('Irgendein Betreff');
$mail->setMessage('Hallo, diese Email wurde ohne Fluent Interface verschickt!');
$mail->send();
 
// und nun mit Fluent Interface
$mail = new MailFluent();
$mail->setTo('mail@example.com')->setSubject('Irgendein Betreff')->setMessage('Hallo, diese Email wurde mit Fluent Interface verschickt!')->send();
 
// oder
$mail = new MailFluent();
$mail
  ->setTo('mail@example.com')
  ->setSubject('Irgendein Betreff')
  ->setMessage('Hallo, diese Email wurde mit Fluent Interface verschickt!')
  ->send();

Das Fluent Interface könnte zusätzlich noch elegant mit dem Singleton Pattern verknüpft werden:

// Instantiierung eines Datenbankobjektes und anschließendes
// zusammensetzen und senden der Query
MySQL::getInstance()->select('*')->from('example')->execute();

Fluent Interfaces leicht erstellt

Hi Benjamin,

ich habe mich im Zuge meiner Bachelorarbeit sehr intensiv mit solchen Fluent Interfaces auseinander gesetzt. Dabei habe ich versucht vor allen Dingen das Erstellen und die Pflege dieser zu erleichtern. Denn bislang ist das ja alles sehr mühsam. Unter http://www.fluent-interfaces.com findet ihr einiges an Material zu meiner Lösung. Dein Ansatz im Beitrag ist nämlich einer der einfacheren. Was wenn du zum Beispiel erzwingen willst das die Benutzer auf jeden Fall alle Daten angeben müssen? Zwar wird zur Zeit nur JAVA unterstützt aber eine Portierung für PHP ist leicht umsetzbar.

Hallo Phillip! Eine bestimmte

Hallo Phillip! Eine bestimmte Reihenfolge der Aufrufe liese sich über die Verteilung der Methoden auf mehrere Klassen natürlich auch in PHP umsetzen. Die Idee finde ich jedenfalls ganz interessant. Eventuell kann ich den Beitrag bei Gelegenheit dahingehend mal noch erweitern.
Danke für deinen Beitrag. Gruß, Benjamin.

Tags