オブジェクト指向プログラミングについて。

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

回答の条件
  • 1人5回まで
  • 登録:2009/05/26 03:05:30
  • 終了:2009/06/02 03:10:03

ベストアンサー

id:sphire No.1

sphire回答回数115ベストアンサー獲得回数122009/05/27 01:43:59

ポイント20pt

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

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

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

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

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

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

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

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

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

id:dedara

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

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

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

2009/05/28 00:13:48

その他の回答(4件)

id:sphire No.1

sphire回答回数115ベストアンサー獲得回数122009/05/27 01:43:59ここでベストアンサー

ポイント20pt

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

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

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

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

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

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

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

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

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

id:dedara

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

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

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

2009/05/28 00:13:48
id:sphire No.2

sphire回答回数115ベストアンサー獲得回数122009/05/28 13:07:48

ポイント20pt

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

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

一般的な方法ですね。

id:dedara

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

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

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

2009/05/30 05:37:50
id:sphire No.3

sphire回答回数115ベストアンサー獲得回数122009/05/31 01:17:11

ポイント20pt

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

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

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

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

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

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

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

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

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();

id:dedara

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

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

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

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

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

2009/05/31 01:28:12
id:sphire No.4

sphire回答回数115ベストアンサー獲得回数122009/05/31 01:36:31

ポイント20pt

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

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

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

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

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

id:dedara

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の記述がない)。こういうものはどこかで何かしらの設定がなされてるのでしょうか

2009/05/31 04:19:11
id:QuestR2 No.5

QuestR2回答回数435ベストアンサー獲得回数132009/06/01 19:20:40

ポイント20pt

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

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

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

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

id:dedara

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

2009/06/02 01:05:54
  • id:sphire
    CakePHPには明るくないのでコメントにしておきます。
    おそらく、例に出されたモデルのスクリプトは、単独で使うことは想定しておらず他のスクリプトから*のみ*requireされうるのだと思います。
    つまり、基底クラス?である AppModel を定義するスクリプトは処理の最初の方でrequireされているものと考えます。

  • id:dedara
    なるほどー。ファイルをincludeしなくても継承できるのか、と短絡的に考えてしまっていました。今回の質問(疑問だったところ)の核心部分かもしれません
  • id:sphire
    たくさんポイントくださってありがとうございます(^^

    ところで、CakePHPの話でしたので意図的に話題にしませんでしたが
    PHP5限定であれば、もう一つ(余計なw)機能があります。
    http://jp.php.net/autoload
    __autoload関数を定義しておくことで、それ以降未定義のクラスを使おうとするときに
    自動的にクラス定義ファイルを読み込むことの出来る機能です。
    (クラス定義ファイルはクラス名から導出できるファイル名である必要があります)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません