![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
クラスインスタンスをメンバ変数として保持した時、その保持しているインスタンスのメンバや関数にはどのようにアクセスすればよいのでしょうか。
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();
?>
No.1ベストアンサー
- 回答日時:
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メソッドをたたく。
?>
(*ソースはインデントするために、全角スペースを使っています。
このままコピーペーストしても動きません。
クラスの外部から直接メンバ変数を呼ぶ方法もありますが、個人的には大嫌いなので解説しません。
ありがとうございます。
ワンクッションおいてアクセスする必要がある、ということですね。
最終的には、次のようになりました。
クラスの内部からメンバ変数を呼ぶとは、このようなことを指すのでしょうか。
私個人としてはありだと思っています。
<?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();
?>
No.2
- 回答日時:
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やってるうちに違和感なくなるんでしょうか。)
しかしこれでスタンダードなオブジェクト指向が行えます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- その他(学校・勉強) Japanese schools tests 1 2022/08/19 14:41
- 中学校受験 Japanese schools 1 2022/08/22 15:53
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- JavaScript test.jsの関数testから別のtest2.jsの関数testをよびだす方法はどのようにするので 3 2023/03/30 11:11
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
ユーザ定義関数にデフォルト引...
-
Objectの型チェック
-
透過PNGが透過されない!!
-
CFileDialogの最初のディレクト...
-
【file_exists】ファイルが存在...
-
フォントの色を変えるには?
-
VB6にてメールを送信する方法
-
C# Excelファイルへの画像挿入。
-
フォームで戻った際に入力済み...
-
.htaccessにphp_valueが使用できな
-
別ファイルの変数を呼び出した...
-
3つ以上の論理積は利用可能なの...
-
onedrive にexcelファイルをア...
-
PHPのif文でその処理を途中で抜...
-
$_SESSION 有効期限をブラウザ...
-
リクエストメソッド
-
pg_exec()、pg_result()は、使...
-
VBSの「MsgBox」について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
phpのクラスにて別ファイルの変...
-
ラッパークラスって何ですか?
-
class定義のphpをファイル分割...
-
phpのクラスメソッドの定義が長...
-
'_'(アンダースコア)の使い方...
-
クラス
-
配列とオブジェクトの違い
-
PHPのクラス名の付け方
-
codeigniter cartのoptions
-
メンバインスタンスへのアクセ...
-
PHPでオブジェクト指向開発して...
-
ユーザー定義関数とクラスの違...
-
ソースファイルの分け方について
-
データベースで値をインクリメ...
-
require_onceについて
-
PHPでサブクラスからスーパクラ...
-
phpで使用不可のクラス名
-
php、可変プロパティ名について
-
比較演算子===と!==について
おすすめ情報