Help us understand the problem. What is going on with this article?

【PHP】PHPでメソッドチェーンを実装する

はじめに

Laravelとかクエリビルダを使っていると、以下ようなのコードをよく見かけると思います。

$user = DB::table('users')
            ->where('name', 'John')
            ->first();

こちらのコード、大変読みやすくないですか??
usersテーブルのnameJohnのレコードの1つを所得するというのが、直感で理解できます。
「呼び出し元が見やすいことコードを書くように心がけたい。」そう感じている、Webエンジニア2年生なのです。

メソッドチェーン

今日は、->を使ってメソッドチェーンを実装しようというお話です。

Calculator.php
class Calculator {

    private $result;

    public static function create(int $int): Calculator {
        return new Calculator($int);
    }

    private function __construct(int $int) {
        $this->result = $int;
    }

    public function plus($int): Calculator {
        $this->result += $int;
        return $this;
    }

    public function minus($int): Calculator {
        $this->result -= $int;
        return $this;
    }

    public function getResult(): int {
        return $this->result;
    }
}
main.php
$result= Calculator::create(10)
                    ->plus(5)
                    ->minus(7)
                    ->getResult();
var_dump($result); // int(8)

ポイント

  • plus(), minus()関数内でreturn $thisをしている。つまり自身のインスタンスを返却している。
  • getReasult()関数で、プロパティを返却している。

メリット

  • 呼び出し元のコードが読みやすくなる。

どんな時に使うのか

  • ある値に対して、同属の処理を行いたい時。今回でいうと、plus(), minus()

補足

  • create()staticにし、その関数内でnewをすることで、呼び出し元でnewをしなくて良くなるため、可読性が上がる
  • __constructorprivateすることで、呼び出し元でnewできなくしている
westhouse_k
Webエンジニア2年目。仕事ではPHP書いてます🐘 趣味は、読書とジャグリング🤹‍♂️
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away