お世話になっております。
PHPの継承の関係について質問させてください。
ある理由がありまして、継承先から継承元にメソッドを渡したいのですがどうしたら良いでしょうか。
元のファイル(hoge.php)に書き込みを入れたくないのが理由です。
hoge.php
HogeClass { public function hoge() { //処理 } }
fuga.php
require_once hope.php; FugaClass extends HogeClass { public function fuga(){ //ここの処理をHogeに持っていきたい。 } }
継承についても理解が足りなく。初心的な質問で申し訳無いのですが、ご教授いただければ幸いです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
多少Hogeに手を加えることになりますが、1行で済みます。
traitを使いましょう。
http://php.net/manual/ja/language.oop5.traits.php
PHP
1trait Fuga { 2 function proc() { 3 echo $this->text; // このthisはtraitをuseしたクラスのインスタンス(つまりHogeのインスタンス)となるので、textが参照可能 4 } 5} 6class Hoge { 7 use Fuga; // trait Fugaの記述がこのクラスに埋め込まれる 8 protected $text = 'hoge'; 9} 10 11 12$hoge = new Hoge(); 13$hoge->proc(); // trait Fugaのprocが呼ばれ、Hogeのtextが参照されhogeと出力される。
追記
Hogeが別のクラスを継承していてもtraitは使えますが、メソッドやプロパティの名前の衝突等に気を使う必要があります(もちろん継承していようがいまいが衝突には注意する必要があります)。
PHP
1trait Fuga { 2 function procA() { 3 echo $this->text; 4 } 5} 6class Piyo { 7 function procA() { 8 echo 'ここの処理はtraitに同名のメソッドがあるのでオーバーライドされる'; 9 } 10 function procB() { 11 echo 'piyo piyo'; 12 } 13} 14class Hoge extends Piyo { 15 use Fuga; // procAがオーバーライドされる 16 protected $text = 'hoge'; 17} 18 19 20$hoge = new Hoge(); 21$hoge->procA(); // trait Fugaのprocが呼ばれ、Hogeのtextが参照されhogeと出力される。 22$hoge->procB(); // procBはtraitの影響を受けず、piyo piyoと出力される。
投稿2017/08/15 02:25
編集2017/08/15 02:50総合スコア9206
0
ごめんなさい、私の理解が間違っているかもしれませんが
ロジックが破綻しているように見受けられます。
hogeからfugaを「勝手に」拡張したものが元のhogeに影響を与えては問題では?
結局fugaの拡張をしたら、hoge側にもそれなりの編集手続きがないと
参照できないでしょう
追記
PHP
1class FugaClass{ 2 public static function fuga(){ 3 print "fuga"; 4 } 5} 6class HogeClass extends FugaClass{ 7 public static function hoge() 8 { 9 print "hoge"; 10 } 11} 12HogeClass::fuga();
投稿2017/08/15 01:48
編集2017/08/15 02:05総合スコア114572
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/15 02:04
2017/08/15 02:07
2017/08/15 02:20
2017/08/15 02:58
0
HogeClass { public function hoge() { //処理 } public function fuga(){ //ここの処理をHogeに持っていきたい。 } } FugaClass extends HogeClass { }
fugaをHogeに移動させてはどうでしょうか?
ただしこの場合、Hogeを継承している他のClassでもfugaメソッドが利用できてしまいます。
投稿2017/08/15 01:59
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/15 02:03
退会済みユーザー
2017/08/15 02:13
2017/08/15 02:23
退会済みユーザー
2017/08/15 02:31
2017/08/15 02:58
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/15 02:40
2017/08/15 02:52
2017/08/15 02:54
2017/08/15 02:57