PHP - Поддельное множественное наследование - Как передать несколько параметров в функции - PullRequest
1 голос
/ 15 сентября 2010

Я нашел это, когда искал способ подделать множественное наследование в PHP (поскольку PHP не поддерживает множественное наследование напрямую).

Могу ли я расширить класс, используя более 1 класса в 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

Ответы [ 2 ]

3 голосов
/ 15 сентября 2010

вы можете использовать call_user_func_array :

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

обратите внимание, что это не будет работать так же хорошо.

1 голос
/ 15 сентября 2010

Вы можете найти ответ здесь в руководстве ?

public function __call($method_name, $args)
{
   return call_user_method_array($method_name, $this->c, $args);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...