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

オブジェクト指向プログラミングについて。
PHP5を使用しています。
たとえばhogehoge::hoge()このようなクラスメソッドを使いたい場合、クラスが記述されたファイルをincludeする必要があると思うのですが、他にもメソッド「hogehoge::hoge()」が定義されたクラスを継承した子クラスにすることでhogehoge::hoge()を使うこともできると思うのですが、
他にそういった外部ファイルのクラスのメソッドを参照する方法には(一般的に使われる方法として)どのようなものがあるでしょうか。
いまいちオブジェクト指向についてわかってない部分が多く、変な質問かもしれませんが…。


●質問者: dedara
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:hoge いまいち オブジェクト指向 クラス ファイル
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● sphire
●20ポイント ベストアンサー

Aというクラスがあり、BというクラスがAを継承し、CというクラスがBを継承していたとして。

Cを使う際には、B、Aのクラス定義も読み込む必要があります。

ただ、普通はCのソースの中でBのクラス定義を読み込んでおり、

Bのソースの中でAのクラス定義を読み込んでいるため、

includeするのはCのクラス定義のみに見えるかと思います。そういうことです。

PHPの拡張(Cなどで書かれた*.so形式のもの)であれば

コンパイル時に組み込んだりphp.iniでextension=*.soとして読み込む必要がありますが

まぁ、includeとは異なる参照方法であると言えるのでしょうか。

(でもそれはオブジェクト指向の話ではないですね)

◎質問者からの返答

ありがとうございます。ほしたかった回答で、とても参考になります。

extensionの話も参考になりました。

クラス(クラスB)のメソッド内で他のクラス定義(クラスA)をincludeしてる場合などにクラスCからクラスBをインスタンス化することによって、クラスCからクラスAのメソッドを参照することは可能でしょうか。というか一般的に使われたりする手法でしょうか。


2 ● sphire
●20ポイント

> クラス(クラスB)のメソッド内で他のクラス定義(クラスA)をincludeしてる場合などにクラスCからクラスBをインスタンス化することによって、クラスCからクラスAのメソッドを参照することは可能でしょうか。というか一般的に使われたりする手法でしょうか。

クラスを継承した場合、継承したクラス内で再定義(オーバーライド)しなかったメソッドは親クラスのものが使われます。

一般的な方法ですね。

◎質問者からの返答

説明がうまくなかったかもしれませんが、継承という話ではなく、

上記の内容はクラスC内でクラスBをNewしてオブジェクトDを作っています。クラスBのメソッドhoge()内でクラスAをincludeしているとき、オブジェクトD->hoge()によってクラスAがincludeされますが、オブジェクトE = オブジェクトD->hoge(); として、オブジェクトEからクラスAのメソッドを参照できたりできるのでしょうか(ちょっと自分で書いてて混乱してますが)

なんとなくいろいろ試してみようと思います


3 ● sphire
●20ポイント

クラスBのメソッドhoge()内でクラスAをincludeしているとき、

オブジェクトD->hoge()によってクラスAがincludeされますが、

オブジェクトE = オブジェクトD->hoge(); として、

オブジェクトEからクラスAのメソッドを参照できたりできるのでしょうか

クラス、オブジェクト、インスタンス、あたりの用語の理解がごっちゃになっている気がします。

「オブジェクトE」と書いてあるものは実際には「クラスAのインスタンスE」なのでは?

includeしているだけではクラスAは使えるようになるだけで、インスタンス化されないのでは?

ちなみに、以下のソースはどう思います?不思議ですか?

<?php

class A {
function aa(){
echo "this is A::aa().\n";
}
}

class B {
var $bb;
function __construct(){
$this->bb = new A();
}
}

class C extends B {
}

$cc = new C();
$cc->bb->aa();

◎質問者からの返答

上のソースについては不思議ではないです。

ただ自分が想定していたケースというのは

classA classBが別のファイルとなっている場合です。

別ファイルのときはファイルをincludeする必要がある、というのが頭にあって、そういう意味で「include」や「取り込む」という言葉を使っていました。

あるいは上のソースは便宜上1ファイルに見えるだけでクラスA,Bは別ファイルということでしょうか


4 ● sphire
●20ポイント

前の回答のコードは全部同じファイルに書かれている前提でした。

では、下の3つのファイルに分かれていたとしたら。

class A {
function aa(){
echo "this is A::aa().\n";
}
}
class B {
var $bb;
function __construct(){
$this->bb = new A();
}
}
class C extends B {
}

B.phpについて。クラスBはコンストラクタでクラスAのインスタンスを生成しているので、その時点でA.phpをincludeしていなければエラーとなります。

C.phpについて。クラスCはクラスBを継承しているので、その時点でB.phpをincludeしていなければエラーとなります。

◎質問者からの返答

A.phpをincludeしていないと(つまり B.php に include('A.php')と記述がない場合)、new A(); のときにエラーになるというのは、なんとなくわかるのですが、C.phpでは、B.phpをincludeしていなくても(つまり C.php に include('B.php')と記述がない場合)エラーにならない気がするのですが。実際CakePHPフレームワークのモデルクラスのファイルには

<?php

class CartsModel extends AppModel

{

}

?>

とだけ書かれたものもあります(特にincludeの記述がない)。こういうものはどこかで何かしらの設定がなされてるのでしょうか


5 ● QuestR2
●20ポイント

includeというのは、ファイルをincludeするだけで何の意味も持ちません。

あと、インスタンスされたオブジェクトの使い方と

静的(static)オブジェクトの使い方と

概念が切り分けられてないと思います。

◎質問者からの返答

クラスを継承する場合、ファイルのincludeは必要がないものだと勝手に誤解していたようです。でもそうでもないのかなあ、というあやふやな部分などもあり、このような質問となりました。静的メソッドのようなものは「オブジェクトを作らずに使える関数」というような認識で使っていました。「静的オブジェクト」という言葉自体は初めて知りました。差し支えなければ、そのあたりの概念の切り分けの説明を簡単にお願いできないでしょうか

関連質問


●質問をもっと探す●



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