こんにちは。いっとくです!
プログラミングは楽しいなぁ。あぁ、楽しい楽しい。
まだエンジニアになってから1年も経っていないので、学ぶべきことが多すぎて、全然飽きが来ない毎日です。
会社で働いているエンジニアなら、フレームワークを使って開発しているところが多いと思うんですけど、フレームワークを使っていると当たり前のようにメソッドチェインを使うことができます。
特にクエリビルダを使ってSQLを発行する時なんかは、メソッドチェインで繋いで繋いで最後にドゴン!と使いますよね。
最近は、今まで理解不能だったオブジェクト指向を使うメリットとか設計とかがふんわりわかってきたのですが、自作したクラスでメソッドチェインを使えるようにする方法がよくわからないという壁にぶつかったので、自分へのメモがてらアウトプット!
メソッドチェインを作るときは戻り値に自身のオプジェクトを渡す
はい。まずは必要な値を渡したあとで、最後に何かをするというクラスを作ります。
今回はサンプルなので、すごい単純なクラスを用意しました。
<?php
class Accounting
{
private $currency;
private $price;
private $discount;
public function setCurrency(string $value)
{
$this->currency = $value;
}
public function setPrice(int $value)
{
$this->price = $value;
}
public function setDiscount(int $value)
{
$this->discount = $value;
}
public function calc()
{
$value = $this->price - $this->discount;
return $value . $this->currency;
}
}
使い方は、インスタンス化したのちに、$currency(通貨)と$price(値段)と$discount(割引)をセットしてから、calc(計算)するというものです。
今まで、既存のソースコードやフレームワークの機能を使っていたので、なんの気なしにメソッドチェインで繋いで使えたんですが、実際に使ってみたら以下のような結果に。
$account = new Accounting;
echo $account->setCurrency('円')
->setPrice(10000)
->setDiscount(300)
->calc();
// 読み込むと以下のエラーが出ます。
// Uncaught Error: Call to a member function setPrice() on null
なんだ、メソッド用意しただけじゃ、いい感じに動かないのか…
という事で、調べてみるとどうやらreturnの時に、自身のオブジェクトを返してあげる必要があるんですね〜。自身のオブジェクトは$thisでオッケーです!
ということで以下のように書き換えます。
<?php
class Accounting
{
private $currency;
private $price;
private $discount;
public function setCurrency(string $value)
{
$this->currency = $value;
return $this;
}
public function setPrice(int $value)
{
$this->price = $value;
return $this;
}
public function setDiscount(int $value)
{
$this->discount = $value;
return $this;
}
public function calc()
{
$value = $this->price - $this->discount;
return $value . $this->currency;
}
}
$account = new Accounting;
echo $account->setCurrency('円')
->setPrice(10000)
->setDiscount(300)
->calc();
// 9700円が出力される
できた!メソッドチェインが使えた!やったー!!
こうやってセッターを繋げてから結果を取得することで、色々な文脈で使える柔軟なクラスに仕上がるので便利ですね〜
ということで、PHPでメソッドチェインが使えるクラスを作る方法でした!
おしまい!
コメント