質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Zend Framework

Zend Frameworkは、PHP5で記述されたWebアプリケーションフレームワークです。Zend Frameworkには守らなければならない開発の規定というものは存在せず、MVCなどの複数のコンポーネントを提供しています。

Q&A

解決済

3回答

338閲覧

php 継承関係について

someiyoshino333

総合スコア16

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Zend Framework

Zend Frameworkは、PHP5で記述されたWebアプリケーションフレームワークです。Zend Frameworkには守らなければならない開発の規定というものは存在せず、MVCなどの複数のコンポーネントを提供しています。

0グッド

0クリップ

投稿2017/08/15 01:35

お世話になっております。
PHPの継承の関係について質問させてください。

ある理由がありまして、継承先から継承元にメソッドを渡したいのですがどうしたら良いでしょうか。
元のファイル(hoge.php)に書き込みを入れたくないのが理由です。

hoge.php

HogeClass { public function hoge() { //処理 } }

fuga.php

require_once hope.php; FugaClass extends HogeClass { public function fuga(){ //ここの処理をHogeに持っていきたい。 } }

継承についても理解が足りなく。初心的な質問で申し訳無いのですが、ご教授いただければ幸いです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

someiyoshino333

2017/08/15 02:40

ご回答ありがとうございます。 traitというものを初めて聞きました。これは便利そうですね。 一つだけ質問ですが、下記サイト http://qiita.com/sasakure-kei@github/items/212637b2f32197441a3a を見たのですが、 Hogeがもしextendsで他のclassを継承していても、 その他のclass内のメソッドをtrait内で呼び出せばHoge内で使用出来るということでよろしいでしょうか。
masaya_ohashi

2017/08/15 02:52

回答に追記しておきました。 Hogeがどんな継承をしていてもtraitは使用可能ですが、うっかり同名のメソッドでオーバーライド等が起きないよう注意する必要があります。そのへんの使い方も公式リファレンスに載っているので確認してください。
masaya_ohashi

2017/08/15 02:54

ちょっと質問に対する回答がずれていましたね。 Hogeが継承しているPiyoが持っているprocPiyoがあったとして、Fuga内で$this->procPiyo()と書くことができるかという質問ですよね。できます。
someiyoshino333

2017/08/15 02:57

ありがとうございます! その方法で実践して見ます!
guest

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
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

someiyoshino333

2017/08/15 01:55

>ごめんなさい、私の理解が間違っているかもしれませんが >ロジックが破綻しているように見受けられます。 すみません、言い方がわかりづらかったのですが、 Hogeの編集権限はあるのですが、Hogeにはあまり手を加えたく無いのです。 なので、Hogeは呼び出しだけで、fugaにロジック自体は書きたいという条件です。
yambejp

2017/08/15 02:04

失礼しました。なんとなくわかりました。 そうなるとむしろHogeをFugaの拡張にするとかでは? 追記しました
yambejp

2017/08/15 02:07

もしくは普通にfugaをインスタンスにして参照すればよいでしょう
someiyoshino333

2017/08/15 02:20

>そうなるとむしろHogeをFugaの拡張にするとかでは? すみません、少し説明が足りなかったのですが、前提条件としてHogeは他のclassを継承しています。 2重継承はできるのでしょうか。 >もしくは普通にfugaをインスタンスにして参照すればよいでしょう 初心者的質問で申し訳ないのですが、これは二重にHogeが呼び出されて、動作が重くなったりはしないのでしょうか。
someiyoshino333

2017/08/15 02:58

コメントありがとうございました。
guest

0

HogeClass { public function hoge() { //処理 } public function fuga(){ //ここの処理をHogeに持っていきたい。 } } FugaClass extends HogeClass { }

fugaをHogeに移動させてはどうでしょうか?
ただしこの場合、Hogeを継承している他のClassでもfugaメソッドが利用できてしまいます。

投稿2017/08/15 01:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

someiyoshino333

2017/08/15 02:03

回答ありがとうございます。 >fugaをHogeに移動させてはどうでしょうか? 構成管理上ファイル自体は別で管理したく、なるべく別ファイルで保有をしたいのですが、難しいでしょうか
退会済みユーザー

退会済みユーザー

2017/08/15 02:13

fugaメソッドをHogeクラスに移動してもFugaクラスがなくなるわけではないので ファイル自体は別で管理できていると思います。 それともfugaメソッドはどうしてもFugaクラスにないと困るということでしょうか?
someiyoshino333

2017/08/15 02:23

>それともfugaメソッドはどうしてもFugaクラスにないと困るということでしょうか? Hogeクラスには直接処理は記入をしたくなく、呼び出し程度の記入に収めたいのですが、 そういうロジックの書き方は少しおかしいでしょうか。
退会済みユーザー

退会済みユーザー

2017/08/15 02:31

なるほどです。いまさら質問なのですが「//ここの処理をHogeに持っていきたい。」というのは Hogeクラスからfugaメソッド内で行っている処理を実行したいということですよね? であれば、共通クラスを作って、その処理を新たに作成し HogeクラスからもFugaクラスからも共通クラスのメソッドを呼んではどうでしょうか?
someiyoshino333

2017/08/15 02:58

コメントありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問