人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpのゲッターメソッドとセッターメソッドについて
よくPHPのオブジェクト指向を学んでいると

public function get~~~(){
return $this->~~~;
}

こんな関数を見かけます。

このgetに関して質問なのですが
これはゲッターメソッドというものなのですか?

ググったところ
ゲッターメソッドは
get_
と後ろに「_」をつけると解説してありました。

さらにググると
__get
と後ろに「__」をつけると解説しているサイトも発見しました。

もう何がなんだかわかりません。
どれが本当のゲッターメソッドなのでしょうか?
あと一番始めに書いたgetは
何者なのでしょうか?

●質問者: てすと
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tdoi
ベストアンサー

e_w_1_kkさん

概念として、オブジェクトのフィールドを取得するためのメソッドが、ゲッターメソッドです。
なので、

public function get~~~(){
 return $this->~~~;
}

は間違いなくゲッターメソッドです。
最初に概念としてと断りを入れたのは、オブジェクトのフィールドを取得することがその定義であり、その命名規則は限定されません。
つまり、

public function ~~~(){
 return $this->~~~;
}

public function retrieve~~~(){
 return $this->~~~;
}

という関数を定義すれば、どちらもゲッターメソッドと呼んで差し支えないでしょう。

ただし、可読性を高めるために、一般的には、getから始める名前を使います。

では、getから始めると一意に決まるかと言うと、ときどき話題に上る、「らくだ記法(キャメル記法、キャメルケース)」と「へび記法(スネーク記法、スネークケース)」の問題が残ります。

例えばですが、dataというフィールドを取得するためのゲッターは、

public getData() {
 return $this->data;
}

とも、

public get_data() {
 return $this->data;
}

とも記述される可能性があります。
この辺りは、宗教というか個々人の思いが入り、チームで開発していれば、チーム内では統一した方がいいとは思いますが、どちらが間違いなく優れているというものではないです。

最初に疑問としていた、get_のものは、ヘビ記法の文化で記述されるゲッターなのです。

では、もう1つの疑問は何かというと、マジックメソッドと呼ばれるものです。
詳細は、以下のマニュアルを読んでください。
http://www.php.net/manual/ja/language.oop5.overloading.php#object.get

この__getマジックメソッドはゲッターとして利用することももちろんできますし、それが一般的な利用方法ではありますが、__getで特殊なことをすれば、その限りではありません。
ただ、多くの場合は、ゲッターメソッドの実装に使われることが多いので、これもゲッターメソッドと呼んで問題ないことが多いと思います。

繰り返しになりますが、オブジェクトのフィールドを取得するためのメソッドのことをゲッターメソッドと呼び、特定の記述をするメソッドのことをゲッターメソッドと呼ぶのではありません。
その意味で、getXXXも、get_xxxも、__getもゲッターメソッドとなる可能性があります。


何かの参考になれば。


てすとさんのコメント
とても詳しくわかりやすい解説、解答ありがとうございました!! あともしよろしければでいいのですが、もう2つ質問があります。 return $this->~~~; これが書いてあればゲッタメソッドということで大丈夫ですか? あと 同じことがセッターメソッドにも言えるのでしょうか?

tdoiさんのコメント
>|php| return $this->XXX; ||< があればというのは、ちょっと言い過ぎかもです。 こじつけのような例ですが、 >|php| class LogHistory { private $count = 0; private $history = array(); function record() { $history[] = date('Y-m-d H:i:s'); ++$this->count; return $this->count; } function getHistoryCount() { return $this->count; } }; ||< というようなクラスがあれば、recordメソッドは呼び出された時刻を記録して、これまでの記録の個数を返すメソッドです。このメソッドの主な役割は、一般的には時刻を記録することです。これをゲッターと呼ぶかといわれると、多分、違うんじゃないかと。 もちろん、getHistoryCountメソッドの方はゲッターと呼んで問題はないと思います。 (※注:return count($this->history); と何故しないという質問は受け付けません) また、本来のオブジェクト指向的な考えをすれば、オブジェクト内でどのようにデータを保持しているかは、外部の管轄外です。 なので、以下のgetFirstName、getLastName、getFullNameはゲッターと呼んでも差し支えないと、僕は思います。 >|php| class Person { private firstName = 'Michael'; private lastName = 'Johdan'; public function getFirstName() { return $this->firstName; } public function getLastName() { return $this->lastName; } public function getFullName() { return $this->fristName . ' ' . $this->lastName; } }; ||> また、データ構造がこうじゃなくて、次ような形だったとしても、getFirstName、getLastName、getFullNameはゲッターと呼んでも差し支えないと、僕は思います。 >|php| class Person { private name = array('Michael', 'Jordan'); public function getFirstName() { return $this->name[0]; } public function getLastName() { return $this->name[1]; } public function getFullName() { return implode(' ', $this->name); } }; ||> セッターについても同じです。オブジェクトのフィールドにデータを設定するメソッドのことをセッターと呼びます。

tdoiさんのコメント
途中で、切れたので続き・・・・。 >|PHP| class Person { private $firstName = 'Michael'; private $lastName = 'Johdan'; public function getFirstName() { return $this->firstName; } public function getLastName() { return $this->lastName; } public function getFullName() { return $this->firstName . ' ' . $this->lastName; } } ||< >|PHP| class Person { private $name = array(''Michael', 'Johdan'); public function getFirstName() { return $this->name[0]; } public function getLastName() { return $this->name[1]; } public function getFullName() { return implode(' ', $this->name); } } ||< >|PHP| class Person { private $fullName = 'Michael Johdan'; public function getFirstName() { $names = explode(' ', $this->fullName); return $names[0]; } public function getLastName() { $names = explode(' ', $this->fullName); return $names[1]; } public function getFullName() { return $this->fullName; } } ||< このように考えると、先ほどはオブジェクトのフィールドと表現してしまいましたが、オブジェクトの要素を取得するためのメソッドがゲッターと呼んだ方がよいかもしれません。 セッターに関しても、同様に、オブジェクトの要素を設定するメソッドと考えればよいかと思います。 いずれにしろ、どれがゲッター、どれがセッターなど厳密に見分けたところで、コードがきれいに書けるようになるとは思えないので、概念として理解する方がよいかと思います。

てすとさんのコメント
これまた詳しく解説していただいて本当にありがとうございました!

てすとさんのコメント
すいません。マルチポストはもうやめます。w
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ