Reply to comment

  • warning: array_fill(): Number of elements must be positive in /var/www/vhosts/benjaminradtke.com/httpdocs/includes/database.inc on line 253.
  • warning: implode(): Invalid arguments passed in /var/www/vhosts/benjaminradtke.com/httpdocs/includes/database.inc on line 253.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/vhosts/benjaminradtke.com/httpdocs/modules/user/user.module on line 528.
  • user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 query: SELECT p.perm FROM role r INNER JOIN permission p ON p.rid = r.rid WHERE r.rid IN () in /var/www/vhosts/benjaminradtke.com/httpdocs/modules/user/user.module on line 528.

Fluent Interface

Your rating: None Average: 5 (1 vote)

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.

  1. class Mail {
  2.  
  3. private $_to;
  4.  
  5. private $_subject;
  6.  
  7. private $_message;
  8.  
  9. public function setTo($to) {
  10. $this->_to = $to;
  11. }
  12.  
  13. public function setSubject($subject) {
  14. $this->_subject = $subject;
  15. }
  16.  
  17. public function setMessage($message) {
  18. $this->_message = $message;
  19. }
  20.  
  21. public function send() {
  22. return mail($this->_to, $this->_subject, $this->_message);
  23. }
  24. }

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.

  1. class MailFluent {
  2.  
  3. private $_to;
  4.  
  5. private $_subject;
  6.  
  7. private $_message;
  8.  
  9. public function setTo($to) {
  10. $this->_to = $to;
  11.  
  12. return $this; // Rückgabe der eigenen Instanz
  13. }
  14.  
  15. public function setSubject($subject) {
  16. $this->_subject = $subject;
  17.  
  18. return $this;
  19. }
  20.  
  21. public function setMessage($message) {
  22. $this->_message = $message;
  23.  
  24. return $this;
  25. }
  26.  
  27. public function send() {
  28. return mail($this->_to, $this->_subject, $this->_message);
  29. }
  30. }

Anwendung

Nun der Aufruf der beiden vorangegangen Beispiele.

  1. // ohne Fluent Interface
  2. $mail = new Mail();
  3. $mail->setTo('mail@example.com');
  4. $mail->setSubject('Irgendein Betreff');
  5. $mail->setMessage('Hallo, diese Email wurde ohne Fluent Interface verschickt!');
  6. $mail->send();
  7.  
  8. // und nun mit Fluent Interface
  9. $mail = new MailFluent();
  10. $mail->setTo('mail@example.com')->setSubject('Irgendein Betreff')->setMessage('Hallo, diese Email wurde mit Fluent Interface verschickt!')->send();
  11.  
  12. // oder
  13. $mail = new MailFluent();
  14. $mail
  15. ->setTo('mail@example.com')
  16. ->setSubject('Irgendein Betreff')
  17. ->setMessage('Hallo, diese Email wurde mit Fluent Interface verschickt!')
  18. ->send();

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

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

Reply

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <abbr>
  • Lines and paragraphs break automatically.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.

Tags