访问已由单独类中的方法实例化的类

时间:2009-03-13 06:20:19

标签: php oop

简而言之:如何访问由不同类的方法实例化的类的方法?

现在有一些我正在查看的代码执行以下操作(修改代码不是一个选项,顺便说一下。这不是我的...我只是破译它):

类有一个实例化不同类的方法。它看起来像这样:

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

所以Baz现在不应该以某种方式可用(而不仅仅是我分配给$ this-> meh的getStuff())?包含Foo和Baz类,代码实例化Foo,然后调用Foo的方法bar(),后者又实例化Baz类。显然,以下内容将显示Baz的getStuff()方法返回的数据:

var_dump($a->meh);

但我想访问Baz可用方法的所有,而不需要像在Foo的bar方法中那样手动分配它们的中间步骤:

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

也许类似(但当然这不起作用):

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

我希望这是有道理的,我没有把这个问题与我的笔记混淆。确认! &GT; _&LT;

2 个答案:

答案 0 :(得分:3)

如果改变代码不是一种选择,那你就不走运了。要实现您想要的目标,请执行以下操作:

class Foo {
    public $meh;
    public $something;

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

然后你可以这样做:

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

答案 1 :(得分:1)

你可以在你的Foo类上使用__call,在php.net上查找

基本上,当你尝试调用类没有的函数时会调用__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!');