Płynny interfejs (ang. Fluent Interface) to wzorzec projektowy stosowany w celu zwiększenia czytelności kodu. Można wykorzystać go na przykład do konfiguracji obiektu.
Struktura:
1 2 |
$object = new Class(); $object->doSomething()->somethingElse()->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(); |
Preferowany zapis w języku PHP:
1 2 3 4 |
$object = (new Class()) ->doSomething() ->somethingElse() ->more(); |
Przykład funkcji z powyższego obiektu:
1 2 3 4 5 6 7 8 9 10 |
private $value; // ... public function doSomething($value) { $this->value = $value; return $this; } // ... |
Funkcja musi zwrócić zmienną specjalną $this. Dzięki temu można połączyć metody w łańcuch operatorem „->„. Bez zwrotki $this musimy zastosować klasyczne podejście gdzie każda metoda przypisana jest do instancji obiektu:
1 2 3 4 |
$object = new Class(); $object->doSomething(); $object->somethingElse(); $object->more(); |
PRZYKŁAD
Klasa Mail posłuży do wysyłania poczty elektronicznej. Wzorzec wykorzystamy do ustawienia parametrów maila. Ten prosty przykład 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 49 50 51 52 53 54 55 56 |
<?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 "The message was sent."; } } } $mail = (new Mail()) ->From('test@example.com') ->addTo('johndoe@domain.com') ->Subject('Test Mail') ->Message('Hello World !') ->send(); |