#クラスメソッドとは?
クラスから直接呼び出すことのできるメソッドです。
クラスメソッドとインスタンスメソッドがあり、インスタンスメソッドはインスタンス(クラスを実現化したもの)を作成する必要があります。
#ちょっとインスタンスについて
インスタンス=クラスを実現化したものって正直わかりにくいですよね。
なので、ここでインスタンスについて整理しておきます。
クラスをnewしたものらしいです。
参考:https://wa3.i-3-i.info/word1118.html
$user = new User;
と書いておけばUserクラスが実現化するってことですね。
ちなみにこの$user
にはnameとかの情報が何も入っていません。
ここにインスタンスメソッドを使ったりして、情報を追加したり削除したり、保存してあげるわけです。
#では、クラスメソッドの書き方について
public static function getPostAttribute()
{
$post = self::orderBy('id', 'desc')->first();
return $post->title;
}
public function index()
{
return view(
'post' => Post::getPostAttribute();
);
}
これでPostクラスの一番初めのidのタイトルを取得できます。
#インスタンスメソッドにすると
public function getPostAttribute()
{
$post = $this:->orderBy('id', 'desc')->first();
return $post->title;
}
public function index()
{
$post = new Post;
return view(
'post' = $post->getPostAttribute();
);
}
#両者の違い
メソッドについては書き方が違うだけで、それほど行数も変わらないし、どちらでも良さそうな感じです。
呼び出しの部分が大きく違うところです。
クラスメソッドは直接クラスから呼び出すので、Post::get~
で呼び出せちゃいます。
対して、インスタンスメソッドは一度インスタンスを作成する必要があるので、
$post = new Post;
という一文が多くなります。
じゃあクラスメソッドの方が記述量が減るしインスタンスメソッドなんて要らないじゃないかと思うかもしれません。
#インスタンスメソッドのメリット
インスタンスメソッドの方が柔軟です。
例えば、
$post = new Post;
を$post = self::orderBy('id', 'desc')
とします。
そうすると、メソッドの方は
$post = $this->first();
になります。
orderByがコントローラーに移っただけ?
そうです。
これは他のアクションで利用する時のことを考えています。
indexアクションではdescでよかったかもしれませんが、他のページではascにしたい場合。
メソッドではなく、コントローラーで指定することでそれぞれ分けることができます。
あくまで一例ですが、クラスメソッドは全てのアクションで同じ動作をさせる場合に使う。
インスタンスメソッドはそれぞれのアクションで1部分だけを使いたい場合に使う。
といったイメージで使い分けると良いかと。