[php]phpでメソッドチェーンを書いてみる

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を返すことで、メソッドチェーンを作れました。

メリットとしてはコードが見やすくなって、短く書けたり
引数がそれぞれ渡せるので、メソッドを連続で呼び出したり、柔軟なクラスが作れそうです。

コメント

タイトルとURLをコピーしました