Method chaining w PHP

Zawarta  w tytule nazwa określa implementację wzorca Fluent interface, który odpowiednio zastosowany może uprościć i skrócić tworzony kod. Użycie Method chaining umożliwia cykliczne wywoływanie metod dla obiektu bez jawnego podawania go za każdym razem. Stąd właśnie wzięła się nazwa tej techniki, gdyż wygląda to jak łańcuszek.

Jak wygląda uzycie Method chaining w praktyce?

Jest on stosowany w wielu różnych językach, a webdeveloperzy mogą go znaleźć między innymi w jQuery lub frameworkach PHP. Upraszcza to znacznie tworzenie kodu, co można zobaczyć na poniższym przykładzie:

$("p").removeClass("class")
	.addClass("another_class")
	.css("color","red")
	.fadeOut("slow");

Jak zaimplementować Method chaining w PHP?

Bardzo podobnie możemy powyższe rozwiązanie wykorzystać w PHP. Jest to niezwykle proste do osiągnięcia, wystarczy, że poszczególne wywoływane metody będą zwracały cały obiekt. Przez to nie będzie trzeba go podawać za każdym razem, lecz utworzyć odpowiedni łańcuch.

Na poniższym przykładzie przedstawiono implementację Method chaining. Jest to klasa bardzo uproszczonego kalkulatora, dzięki któremu możemy wykonywać podstawowe działania matematyczne.

class Calculator{
	private $_result = 0;

	public function __construct($value = 0) {
		$this->_result = $value;
		return $this;
	}

	public function add($value){
		$this->_result+=$value;
		return $this;
	}

	public function subtract($value){
		$this->_result-=$value;
		return $this;
	}

	public function multiply($value){
		$this->_result*=$value;
		return $this;
	}

	public function divide($value){
		$this->_result/=$value;
		return $this;
	}

	public function getResult(){
		return $this->_result;
	}
}

Implementacja Metchod chaining kryje się w wywołaniu return $this na końcu każdej metody odpowiedzialnej za działania matematyczne. Dzięki temu będzie możliwe niezwykle proste wykonanie obliczeń:

$calc = new Calculator(5);
print $calc->add(2)
		->subtract(1)
		->divide(2)
		->multiply(3)
		->getResult();

Pominięcie osobnego tworzenia obiektu

Możliwe jest także zastosowanie Method chaining bezpośrednio przy wywołaniu obiektu, dzięki czemu nie będziemy musieli tworzyć go w osobnej linii. Wystarczy w tym celu dodać do klasy Calculator statyczną metodę start(), która zwróci nam utworzony obiekt:

public static function start($value = 0){
	return new Calculator($value);
}

Dzięki takiemu rozwiązaniu możemy jeszcze bardziej uprościć wywołanie kalkulatora:

print Calculator::start(5)->add(4)->divide(3)->getResult();

Jeden Komentarz

Dodaj komentarz