我有一个需要身份验证的数据库接口对象DBI。我有一个对象foo,它不会扩展任何东西。我还有一个扩展DBobject的类栏如果我有一个foo实例,那么它是bar的成员:
$b->$f=new foo;
如何从foo类中的函数调用$ b中的somefunction()?我已尝试将somefunction()设为静态,但我不希望在我的代码中散布身份验证信息。如果我尝试让foo扩展DBI或bar类,我最终会遇到一个问题,包括文件和我的foo __construct函数失败,因为找不到bar类。是否有另一个类似于extends / parent ::的构造,我可以使用只是彼此实例的对象?
答案 0 :(得分:1)
我过去做过这种方式的方法是在__construct()中的Bar对象中创建Foo对象。然后使用__call魔术方法拦截方法并查看它的位置。所以代码看起来像这样:
public function __call($sMethod, $aArgs) {
if(method_exists($this, $sMethod){
return call_user_func_array(array($this, $sMethod), $aArgs);
}
} elseif(method_exists($this->foo, $sMethod)) {
return call_user_func_array(array($this->foo, $sMethod), $aArgs);
}
}
public function __construct() {
$this->foo = new foo();
}
然后你可以从foo或bar调用这些函数,即使它们没有被扩展。但是,也许有一种更简单的方法可以做到这一点。
**编辑** 这样做的好处是你不需要指定你是从foo还是从bar调用方法,它们只是“工作”。
**编辑**
根据评论,您想要这样做,对吗?因为根据下面的代码,如果你运行它,它可以正常工作。
class foobar {
public function test() {
echo 'This is a test';
}
}
class foo extends foobar {
}
class bar {
}
$bar = new bar();
$bar->foo = new foo();
$bar->foo->test();
或替代方案:
class foobar {
public function test() {
echo 'This is a test';
}
}
class foo extends foobar {
}
class bar {
public function testFooBar() {
$this->foo->test();
}
}
$bar = new bar();
$bar->foo = new foo();
$bar->testFooBar();
只要您知道要为对象设置的属性名称,两者都可以正常工作。
答案 1 :(得分:1)
除了call_user_func
和call_user_func_array
之外,如果要访问容器对象(而不是父类)的方法和属性,则需要对它进行引用。 Here是一个类似的帖子。