2009-03-13 18 views
1

要点:別のクラスのメソッドでインスタンス化されたクラスのメソッドにアクセスするにはどうすればよいですか?別のクラス内のメソッドによってインスタンス化されたクラスへのアクセス

私は今、それは(コードを変更することはところで、オプションではありませんそれは私のものではありません...私はちょうどそれを解読しています。)以下のんで探していたコードのビットがあります:

は、

クラスには、別のクラスをインスタンス化するメソッドがあります。

 
// this file is named fooClassHere.php 

class Foo{ 
    public $meh; 

    function bar(){ 
     $something = new Baz; 
     $this->meh = $something->getStuff(); 
    } 
} 

私が理解しようとしているのは、このインスタンス化されたクラスBazのメソッドにアクセスする方法です。別のページには、以下のようなものが含まれます。

 
include 'bazClassHere.php'; 
include 'fooClassHere.php'; 

$a = new Foo; 
$a->bar(); 

だから、バズのすべてが何らかの形で利用可能になりましてはならない(私はます$ this-に割り当てられていないだけでgetStuff()>をMEH)? FooとBazクラスが含まれ、コードはFooをインスタンス化し、次にFooのメソッドbar()を呼び出し、Booクラスをインスタンス化します。明らかに、以下は、バズのgetStuff()メソッドによって返されたデータが表示されます:

 
var_dump($a->meh); 

をしかし、私はFooのの内側に行ったようにそれらを手動で割り当てる中間ステップを経由することなく、バズの利用可能な方法のすべてにアクセスしたいのですがバー法:たぶん

$this->meh = $something->getStuff()

のようなもの(もちろん、これは動作しません):

 
$a = new Foo;
$a->bar(); //instantiates Baz as $something $a->something->fromBaz(); //$something is an instance of Baz, yes? No?

私は、これは理にかなって願っていますし、私は自分のノートの問題を混同していませんでした。ああ! > _ <

答えて

3

コードを変更することはオプションではない場合、あなたは不運です。

class Foo { 
    public $meh; 
    public $something; 

    function bar(){ 
     $this->something = new Baz; 
     $this->meh = $this->something->getStuff(); 
    } 
} 

し、後であなたが行うことができます上:

$foo = new Foo; 
$foo->something->myBazMethod(); 
+0

したがって、OPの$ a-> something-> fromBaz()は機能しますか?つまり、彼の何かとあなたのバズはバズのインスタンスですか? –

+0

いいえ、$ somethingはbar()メソッドのローカル変数なので、OPは機能しません。彼は何かをクラス変数にして$ thisを使って設定し、Fooオブジェクトを通してクラス外の新しいBazオブジェクトにアクセスする必要があります。 –

+0

素晴らしい!私は元のコードを変更することはできませんが、実際にこの作業を見たいので、実際のコードを複製し、Bazをクラス変数にインスタンス化していた変数を宣言したとおりに動作させます。それは私の頭の中でOOP全体をよりストレートにするのに役立ちます。ありがとう(FSUに行く)。 – Stuart

1

あなたはphp.net

上でそれを見て、あなたのFooクラスで__call使用することができ、あなたがこれを行う欲しいものを達成するために、

基本的に、クラスにはない関数を呼び出そうとすると__callが呼び出されます。そこに、あなたの内側のオブジェクトに要求を渡すことができます。

class a 
{ 
    protected $b; 

    public function __construct() 
    { 
     $this->b = new b(); 
    } 

    public function meh() 
    { 
     return 'meh'; 
    } 

    public function __call($func, $param) 
    { 
     return call_user_func_array(array($this->b, $func), $param); 
    } 
} 

class b 
{ 
    public function yo($something) 
    { 
     return $something; 
    } 
} 

$a = new a(); 
echo $a->meh(); 
echo $a->yo('dude!'); 
+0

こんにちはマリオ、あなたはこれを行う方法の例がありますか?存在しないが、別のオブジェクトの一部であるメソッドにアクセスするのではなく、呼び出されている存在しないメソッドを処理するために__callを使用しました。 – Stuart

+0

確かに、私の更新された答えを見てください。 – Mario

関連する問題