-
ID:DH4/UT さんの質問

クラスメソッドとインスタンスメソッドの使い分けがよく理解出来ていないのですが、どなたか私がこれらの違いについて理解を深めるために、その違いをご教授頂けないでしょうか?

PHPで普段はWebのプログラムをフレームワークを使って書いているのですが、DBへのデータのやり取りは全て、クラスメソッドとして定義してしまっています。

例えば、「static public getPostById()」みたいな感じで。

自分が気付いていないだけかもしれませんが、実際、DBとのやりとりに関するメソッドは全てクラスメソッドとして書いていても問題が特に無いように感じています。

なので、自分としては「全部、クラスメソッドでも大丈夫なんじゃないか?その方が毎回インスタンス化しなくても良いし。」と思ってしまう訳ですが、これらの使い分けというか違いについて教えて頂けないでしょうか?

ちなみに、自分がなんとなく感じている違いや使い分けはこれらです。

  1. インスタンスメソッドはインスタンスがあって初めて、使えるもの。
    対してクラスメソッドはクラスそのものに属するメソッドなので、インスタンスがあるなしに関わらず使えるもの。
  1. インスタンスメソッドはインスタンスを生成する時にインスタンス変数を好きなように設定出来るので、個々のインスタンスがそれぞれ違う値を使って、インスタンスメソッドを実行出来るようになる(?)
    それがクラスメソッドには無いメリットを何らかのかたちで生み出すことが出来る???例えば、個々のインスタンス毎に異なる値(変数)を持たせる必要がある場合はインスタンスメソッドとして定義すると良いとか。
  1. クラスメソッドは基本的にpublicで定義する(?)

オブジェクト指向を理解して良いコードをかけるようになりたいのですが、
いろいろと混乱してしまいます。

経験豊富な先輩方、よろしければご教授頂ければ有り難いですm(_ _)m

みんなの回答 2 件

ID:E14oZY さんの回答

1と2は理解してる通りでいいと思います。ただ全部クラスメソッドだと、例えば複数のDBに接続する場合は困ると思います。それぞれにインスタンスを生成し、プロパティに接続情報を持たせるのが普通かと。世に出回っているDBインターフェイスクラスはほとんどそうなっています。
3はそうではなく、汎用的に使えるようなメソッドは public、クラス内だけで使用するようなものは private(protected) とするのが良いのでは。

ID:DH4/UT

>例えば複数のDBに接続する場合は困ると思います。

なるほど!!今まで複数のDB接続するっていうことが無かったので全くそういう状況を考えたことありませんでした。確かに複数のDB接続する場合はインスタンス化して、それぞれに異なる接続情報を持たせる必要がありますね。ありがとうございます!!

>3はそうではなく、汎用的に使えるようなメソッドは public、クラス内だけで使用するようなものは private(protected) とするのが良いのでは。

こちらについても、自分で今日、いろんなサンプルを作ってみたので理解が深まりました。ありがとうございますm(_ _)m

ID:JLK5IT さんの回答

レガシー感あるけど、トピ主にはシングルトンと静的遅延束縛についても調べてみてほしいな。

ID:DH4/UT

>静的遅延束縛

static::で小クラスのメソッドを
親クラスから呼び出すやつですよね?
今日、本で読んだばかりなのですが^^;

>シングルトン
こちらは静的変数を使って、あるクラスのインスタンスが1つであることを保証するデザインパターンでしたか?
なんとなーく知識だけはあるのですが、全く使い方というか使い道がわかりません。

ID:9Ai/23
  • 自分が作ったコードを、他人が利用する際に初歩的なバグが発生しなくなる。
  • ユーザ認証に関する処理他、様々な処理が重複するのを防げる。
  • 処理が重複するのを防げるから資源の節約になる。
  • クラス内部に値を保持できるため、インスタンス化した際に、どっからでもその値にアクセス可能

私も詳しくありませんがこんなんじゃないかと理解しております。

ID:DH4/UT

>自分が作ったコードを、他人が利用する際に初歩的なバグが発生しなくなる。

確かに人に使ってもらう時は、クラスメソッドだと使う側もわかりやすいかもしれませんね^^

>・ユーザ認証に関する処理他、様々な処理が重複するのを防げる。
この辺、知識不足のためちょっとイメージが湧きづらかったですが、
特にインスタンス化して個々のオブジェクトに異なる値を
持たせる必要がない処理ということでしょうかね。
ユーティリティークラスみたいな。

>・処理が重複するのを防げるから資源の節約になる。
jsのprototypeにメソッドを入れるみたいな感じですかね。
jsのprototypeメソッドはクラスメソッドとは違いますが、
資源の節約という意味で同じなのかなと。

>クラス内部に値を保持できるため、インスタンス化した際に、どっからでもその値にアクセス可能

同じクラスのインスタンスであれば、共通の値を持ちアクセス出来るのですよね。例えば、インスタンス生成した時に、クラス変数の値を1増やすようにコンストラクタに処理を書いておいて、そして、デコンストラクタにはクラス変数の値を1減らすみたいな。それによって、今、そのクラスのインスタンスが何個、存在しているのか把握出来ると。

最終更新日:2013-09-17 (16,378 views)

関連するトピックス

ページ上部に戻る