简而言之:如何访问由不同类的方法实例化的类的方法?
现在有一些我正在查看的代码执行以下操作(修改代码不是一个选项,顺便说一下。这不是我的...我只是破译它):
类有一个实例化不同类的方法。它看起来像这样:
// 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;
答案 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!');