dポイントプレゼントキャンペーン実施中!

クラスインスタンスをメンバ変数として保持した時、その保持しているインスタンスのメンバや関数にはどのようにアクセスすればよいのでしょうか。

PHPの文法がまだよくわからないのですが、次のようにやると、エラーになってしまいました。

<?php
class Test {
 var $member;

 public function __construct() {
  $member = new Hello();
 }

 public function test() {
  $this->member->world();
 }
}

class Hello {
 public function world() {
  echo 'hello world';
 }
}

$test = new Test();
// $test->test();はエラーとなってしまう。
$test->test();
?>

A 回答 (2件)

PHP5という前提で回答します。

PHP4では違ってきます。


まず、Testクラスのコンストラクタですが、スコープが違います
 public function __construct() {
  $this->member = new Hello();
 }
としましょう。
さらに、

Testクラスの testメソッドですが、大文字小文字の違いはありますが、クラス名と同じメソッド名を使うのは避けましょう。
php4のコンストラクタの使い方と混同しますし、思わぬ誤作動の可能性もあります。

で、肝心の回答ですが、
クラス「Test」内の メンバ変数「member」に格納されている インスタンス「Hello」を触りたいのであれば、アクセッサを作りましょう

<?php

class Test {
 
 /**
  * @var Hello
  */
 private $member;

 /**
  * コンストラクタ
  */
 public function __construct() {
  $this->member = new Hello();
 }

 /**
  * ゲッター。 Helloを返すアクセッサです。
  * @return Hello
  */
 public function getHello() {
  return $this->member;
 }
 
}

class Hello {
 public function world() {
  echo 'hello world';
 }
}


$test = new Test();//Testのインスタンス生成
$hello = $test->getHello();//Helloを受け取って
$hello->world();//worldメソッドをたたく。

?>
(*ソースはインデントするために、全角スペースを使っています。
このままコピーペーストしても動きません。







クラスの外部から直接メンバ変数を呼ぶ方法もありますが、個人的には大嫌いなので解説しません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ワンクッションおいてアクセスする必要がある、ということですね。

最終的には、次のようになりました。
クラスの内部からメンバ変数を呼ぶとは、このようなことを指すのでしょうか。
私個人としてはありだと思っています。
<?php
class Test {
 var $member;

 public function __construct() {
  $this->member = new Hello();
 }
 public function helloWorld() {
  $member = $this->getMember();
  $member->world();
 }

 private function getMember() {
  return $this->member;
 }
}

class Hello {
 public function world() {
  echo 'hello world';
 }
}

$test = new Test();
$test->helloWorld();
?>

お礼日時:2008/05/23 16:37

No1再びです。



>クラスの内部からメンバ変数を呼ぶとは、このようなことを指すのでしょうか。
>私個人としてはありだと思っています。

はい、もちろんありありです。
同一クラス内のメンバ変数にアクセスする際にも、そのメンバ変数にアクセスするためのアクセッサを作っておくってのは私は好きです。
(嫌いな人もいるようですが。
まぁ、ここらへんになると、どっちが良い悪いではなく、ポリシーや哲学的な事が判断基準になりますからね。




あと、おまけとして
 public function helloWorld() {
  $member = $this->getMember();
  $member->world();
 }

こういう書き方もできます。
 public function helloWorld() {
  $this->getMember()->world();
 }



あと、メンバ変数の定義ですが
var $member;
ではなく
private $member; (そのクラス内でしか参照できない

protected $member; (そのクラス、および継承したクラスでしか参照できない。
としておくことをお勧めします
    • good
    • 0
この回答へのお礼

なるほどありがとうございます。
$this->member->world()
はだめで
$this->getMember()->world()
はOKというあたりがなんともアレですね。
(PHPやってるうちに違和感なくなるんでしょうか。)

しかしこれでスタンダードなオブジェクト指向が行えます。

ありがとうございました。

お礼日時:2008/05/23 22:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!