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

クラスメソッドをやっと理解した

More than 1 year has passed since last update.

クラスメソッドとは?

クラスから直接呼び出すことのできるメソッドです。
クラスメソッドとインスタンスメソッドがあり、インスタンスメソッドはインスタンス(クラスを実現化したもの)を作成する必要があります。

ちょっとインスタンスについて

インスタンス=クラスを実現化したものって正直わかりにくいですよね。
なので、ここでインスタンスについて整理しておきます。
クラスをnewしたものらしいです。

参考:https://wa3.i-3-i.info/word1118.html

$user = new User;
と書いておけばUserクラスが実現化するってことですね。
ちなみにこの$userにはnameとかの情報が何も入っていません。
ここにインスタンスメソッドを使ったりして、情報を追加したり削除したり、保存してあげるわけです。

では、クラスメソッドの書き方について

Post.php
public static function getPostAttribute()
    {
        $post = self::orderBy('id', 'desc')->first();
        return $post->title;
    }
PostController.php
public function index()
    {
        return view(
            'post' => Post::getPostAttribute();
        );
    }

これでPostクラスの一番初めのidのタイトルを取得できます。

インスタンスメソッドにすると

Post.php
public function getPostAttribute()
    {
        $post = $this:->orderBy('id', 'desc')->first();
        return $post->title;
    }
PostController.php
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部分だけを使いたい場合に使う。
といったイメージで使い分けると良いかと。

kenji__n
大手IT→ベンチャーへ転職した社会人4年目のプログラマ。 サーバサイド中心ですが、最近はフロントエンドも勉強しつつ、副業でプログラミング講師をやったり、SPAの案件に携わったりしてます。 ブログでもエンジニア系の事を発信しています。
https://ongaku.org/
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