我在搜索如何伪造PHP中的多重继承时发现了这一点(因为PHP不直接支持多重继承)。
Can I extend a class using more than 1 class in PHP?
以下是完整的代码: -
class B {
public function method_from_b($s) {
echo $s;
}
}
class C {
public function method_from_c($s) {
echo $s;
}
}
class A extends B
{
private $c;
public function __construct()
{
$this->c = new C;
}
// fake "extends C" using magic function
public function __call($method, $args)
{
$this->c->$method($args[0]);
}
}
$a = new A;
$a->method_from_b("abc");
$a->method_from_c("def");
问题
此处给出的示例仅考虑函数C::method_from_c($s)
的一个参数。它可以正常使用一个参数,但我有几个函数class C
,一些有2个,有些有3个参数,如下所示: -
class C {
public function method_from_c($one,$two) {
return $someValue;
}
public function another_method_from_c($one,$two, $three) {
return $someValue;
}
}
我不想要改变C类函数定义中的任何内容(它必须接受那么多参数)。例如。我不想在我的C::method_from_c($s,$two)
中使用func_get_args(),如下所示: -
public function method_from_c()
{
$args = func_get_args();
//extract params from $args and then treat each parameter
}
在__call()
的{{1}}函数内执行哪些操作以使其正常工作。我希望能够调用class A
Class C
函数
感谢
Sandeepan
答案 0 :(得分:3)
您可以使用call_user_func_array:
function __call($method, $args) {
call_user_func_array(array(&$this->c, $method), $args);
}
请注意,这不会表现得那么好。
答案 1 :(得分:1)
您可以在manual?
中找到答案public function __call($method_name, $args)
{
return call_user_method_array($method_name, $this->c, $args);
}