- ベストアンサー
メンバインスタンスへのアクセス方法
- クラスインスタンスを保持した場合、そのインスタンスのメンバや関数へのアクセス方法がわからない。
- PHPの文法について理解が不十分な状態で、エラーが発生してしまう。
- Testクラスのmember変数にHelloクラスのインスタンスを保持したいが、上手く機能していない。
- みんなの回答 (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メソッドをたたく。 ?> (*ソースはインデントするために、全角スペースを使っています。 このままコピーペーストしても動きません。 クラスの外部から直接メンバ変数を呼ぶ方法もありますが、個人的には大嫌いなので解説しません。
その他の回答 (1)
- inu2
- ベストアンサー率33% (1229/3720)
No1再びです。 >クラスの内部からメンバ変数を呼ぶとは、このようなことを指すのでしょうか。 >私個人としてはありだと思っています。 はい、もちろんありありです。 同一クラス内のメンバ変数にアクセスする際にも、そのメンバ変数にアクセスするためのアクセッサを作っておくってのは私は好きです。 (嫌いな人もいるようですが。 まぁ、ここらへんになると、どっちが良い悪いではなく、ポリシーや哲学的な事が判断基準になりますからね。 あと、おまけとして public function helloWorld() { $member = $this->getMember(); $member->world(); } こういう書き方もできます。 public function helloWorld() { $this->getMember()->world(); } あと、メンバ変数の定義ですが var $member; ではなく private $member; (そのクラス内でしか参照できない や protected $member; (そのクラス、および継承したクラスでしか参照できない。 としておくことをお勧めします
お礼
なるほどありがとうございます。 $this->member->world() はだめで $this->getMember()->world() はOKというあたりがなんともアレですね。 (PHPやってるうちに違和感なくなるんでしょうか。) しかしこれでスタンダードなオブジェクト指向が行えます。 ありがとうございました。
お礼
ありがとうございます。 ワンクッションおいてアクセスする必要がある、ということですね。 最終的には、次のようになりました。 クラスの内部からメンバ変数を呼ぶとは、このようなことを指すのでしょうか。 私個人としてはありだと思っています。 <?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(); ?>