Method Chaining w PHP

chain.jpg

Chciałbym poświęcić chwilę bardzo ciekawej technice programowania, która z nie wiadomych dla mnie względów jest często nie doceniana i pomijana przy projektowaniu klas. Już na samym wstępie powinienem zaznaczyć, że ta technika nie jest konieczna do prawidłowego działania programu, jej głównymi zaletami jest zwiększenie czytelności kodu i częściowe jego skrócenie. Warto też wiedzieć, że Method chaining jest jedną z implementacji wzorca Fluent interface, zainteresowanych po więcej informacji na ten temat odsyłam do Wikipedii.

Implementacja, czyli return $this

Ponieważ, zagadnienie jest stosunkowo proste od razu przejdę do krótkiego przykładu przedstawiającego zastosowanie tej techniki. Według mnie naturalnym przykładem jest klasa obsługująca maile:

class Mail
{
private $_to;
private $_subject;
private $_mailMassage;

public function addTo($emailTo)
{
$this->_to = $emailTo;
return $this;
}

public function addSubject($subject)
{
$this->_subject = $subject;
return $this;
}

public function massage($massage)
{
$this->_mailMassage = $massage;
return $this;
}

public function send()
{
mail($this->_to,$this->_subject,$this->_mailMassage);
}
}

$mail = new Mail;
$mail->addTo('adres@email.pl')
->addSubject('Mail testowy')
->massage('To jest wiadomość')
->send();

Klasa, nie wyróżnia się niczym specjalnym po za jednym małym szczegółem, każda metoda, która ma korzystać z method chaining zawiera return $this (addTo(), addSubject(), massage()). Innymi słowy metoda zwraca instancje własnego obiektu, dzięki któremu możemy wykonywać kolejną metodę z tego obiektu, co jest kluczem do stosowania tej techniki. Oczywiście ciągle możemy korzystać z naszej klasy w sposób tradycyjny:

$mail = new Mail;
$mail->addTo('adres@email.pl');
$mail->addSubject('Mail testowy');
$mail->massage('To jest wiadomość');
$mail->send();

Zastosowanie

Naturalnie metoda ta nie ogranicza się tylko do języka PHP, stosowana jest w C++, Javie oraz nagminnie w JavaScript. Na pewno wiele ludzi kojarzy i często korzysta z tej techniki w jQuery, gdzie możemy budować sekwencje operacji na danym elemencie DOM np:

$("#box").animate({opacity: "0.1", left: "+=400"}, 1200)
.slideUp()
.slideDown("slow")

Najczęściej można ją spotkać w różnego rodzaju frameworkach, np wspomniana klasa Mail w Zendzie ma możliwość wykorzystania fluent interface. Podobnie jest w przypadku query buildera w Kohanie, dzięki któremu możemy w bardzo ciekawy i czytelny sposób tworzyć zapytania do bazy w modelu:

$this->db->select('title, content')
->from('article')
->where(array('id >=' => 5))
->get();

Method chaining jak widać jest prosty w użyciu, a może sprawić, iż stosowanie klasy będzie czytelne i wygodniejsze.

Dodaj komentarz Komentarze są moderowane, a przy linkach używane jest rel="nofollow". Prosimy o nie reklamowanie i nie spamowanie w komentarzach.
Linki tworzone za pomocą tagu [url] np: [url=www.xyz.pl]xyz[/url]
Źródła za pomoc tagu [code] z wskazaniem języka np. [code=php] echo [/code]

Copyright © 2019 Webnote

Projekt i wykonanie: Tworzenie stron internetowych

Dodaj link