Płynny interfejs (ang. Fluent Interface) to wzorzec stosowany w celu zwiększenia czytelności kodu. Można wykorzystać go na przykład do konfiguracji obiektu.
Przykładowa postać:
1 2 |
$object = new Class(); $object->doSomething()->somethingElse()->more(); |
Preferowany zapis:
1 2 3 4 |
$object = (new Class()) ->doSomething() ->somethingElse() ->more(); |
Przykład funkcji użytej w powyższym zapisie:
1 2 3 4 5 6 |
private $value; public function doSomething($value) { $this->value = $value; return $this; } |
Zauważ, że funkcja zwraca instancję obiektu: return $this. W ten sposób możemy łączyć metody operatorem „->” w łańcuch i nie musimy powielać instancji obiektu, jak w przypadku klasycznego podejścia:
1 2 3 4 5 |
$object = new Class(); $object->doSomething(); $object->somethingElse(); $object->more(); |
Jeżeli korzystasz z jakiegoś frameworka, to na pewno spotkałeś się już z tym wzorcem, choćby nawet w jQuery 🙂 :
1 |
$("div").addClass("blue").css("display","block").fadeIn(); |
PRZYKŁAD
Poniższa klasa Mail posłuży do wysyłania poczty elektronicznej. Wzorzec Fluent Interface wykorzystamy do ustawienia parametrów funkcji mail. To naprawdę prosty przykład, który co nieco wyjaśni.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php class Mail { private $from; private $to; private $subject; private $message; public function From($from) { $this->from = $from; return $this; } public function addTo($to) { $this->to = $to; return $this; } public function Subject($subject) { $this->subject = $subject; return $this; } public function Message($message) { $this->message = $message; return $this; } public function send() { $success = mail( $this->to, $this->subject, $this->message, 'From: '.$this->from ); if ( !$success ) { print_r(error_get_last()['message']); } else { print "Message was sent."; } } } $mail = (new Mail()) ->From('tester@example.com') ->addTo('contact@example.com') ->Subject('Fluent Interface') ->Message('Hello World !') ->send(); |
Przykład na GitHub →