phpでメソッドチェーンを書いてみる!
phpでメソッドチェーンをあまり意識せず使っていましたが、
実際に作る場合はどう実装するのか試してみました。
メソッドチェーン?
$hoge->fuga()->get(); のように繋げてメソッドを呼ぶやり方です。
javascriptやjava、C#など色々な言語で書けますが、phpでどう書くのか試してみました。
サンプル
今回は計算をするクラスを作成してみました。
コード
class Calculator
{
private $int1;
private $int2;
private $type;
public function __construct()
{
return $this;
}
public function setType($str)
{
$this->type = $str;
return $this;
}
public function setInt1($int1)
{
$this->int1 = $int1;
return $this;
}
public function setInt2($int2)
{
$this->int2 = $int2;
return $this;
}
public function execute()
{
$returnValue = 0;
switch ($this->type) {
case '+':
$returnValue = $this->int1 + $this->int2;
break;
case '-':
$returnValue = $this->int1 - $this->int2;
break;
case '*':
$returnValue = $this->int1 * $this->int2;
break;
case '/':
$returnValue = $this->int1 / $this->int2;
break;
}
return $returnValue;
}
}
解説
計算するタイプ(足し算、引き算、掛け算、割り算)と値を2つ渡して計算するようにしています。
setTypeに計算タイプを渡して
setInt1, setInt2にそれぞれ値を渡して
executeで値を返すようにしています。
ポイントは$thisで自分のインスタンスを返すようにしているところです。
これでインスタンスが返ってくるので続けて [->] を使って処理を書くことが可能になります。
動作確認
作ったクラスを使って、動作を確認してみました。
// newしてそのまま書くこともできる
echo (new Calculator())->setType('+')->setInt1(10)->setInt2(15)->execute() . "\n";
echo (new Calculator())->setType('-')->setInt1(120)->setInt2(15)->execute() . "\n";
// こういう書き方も可
$calc = new Calculator();
echo $calc->setType('*')->setInt1(10)->setInt2(15)->execute() . "\n";
echo $calc->setType('/')->setInt1(30)->setInt2(3)->execute() . "\n";
// 出力結果
25
105
150
10
おわりに
phpでもthisを返すことで、メソッドチェーンを作れました。
メリットとしてはコードが見やすくなって、短く書けたり
引数がそれぞれ渡せるので、メソッドを連続で呼び出したり、柔軟なクラスが作れそうです。
コメント