はじめに
Laravelとかクエリビルダを使っていると、以下ようなのコードをよく見かけると思います。
$user = DB::table('users')
->where('name', 'John')
->first();
こちらのコード、大変読みやすくないですか??
users
テーブルのname
がJohn
のレコードの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
をしなくて良くなるため、可読性が上がる -
__constructor
をprivate
することで、呼び出し元でnew
できなくしている