2010-09-15 62 views
1

我在搜索如何伪造PHP中的多继承(因为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类的函数定义去改变什么(它必须接受那些许多参数)。例如。我不希望使用func_get_args()我C::method_from_c($s,$two)像这里面的: -

public function method_from_c() 
{ 

    $args = func_get_args(); 

    //extract params from $args and then treat each parameter 
} 

什么的__call()功能class A使其作品里面做。我希望能够调用Class C功能,如$obj->method_from_c($one,$two);

感谢
Sandeepan

回答

3

您可以使用call_user_func_array

function __call($method, $args) { 
    call_user_func_array(array(&$this->c, $method), $args); 
} 

注意,这虽然不会执行,以及。

+0

$ this-> c的引用运算符是多余的 – symcbean 2010-09-15 13:13:28

+0

谢谢!有效!!为什么它表现不佳? – 2010-09-15 13:18:09

+0

@sandeepan:实际上我不确定,但我依稀记得在某处读过$ foo - > $ bar()比使用call_user_func更好。 – 2010-09-15 13:29:14

1

你可以在manual找到答案?

public function __call($method_name, $args) 
{ 
    return call_user_method_array($method_name, $this->c, $args); 
} 
+0

拉乌尔公爵的回答比我的好 - (call_user_method fns已弃用) – symcbean 2010-09-15 13:11:49

+0

也为你+1! – 2010-09-15 13:18:49