LoginSignup
26
24

More than 5 years have passed since last update.

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

Posted at

クラスメソッドとは?

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

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

インスタンス=クラスを実現化したものって正直わかりにくいですよね。
なので、ここでインスタンスについて整理しておきます。
クラスを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部分だけを使いたい場合に使う。
といったイメージで使い分けると良いかと。

26
24
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
24