Вызов конструктора из переменных аргументов с помощью PHP - PullRequest
12 голосов
/ 14 апреля 2010

У меня есть функция, которая принимает переменные аргументы, которые я получаю из func_get_args().

Эта функция должна вызывать конструктор с этими аргументами. Однако я не знаю, как это сделать.

С call_user_func вы можете вызывать функции с массивом аргументов, но как бы вы вызвали конструктор из него? Я не могу просто передать массив аргументов; он должен верить, что я назвал это "нормально".

Спасибо!

Ответы [ 2 ]

20 голосов
/ 14 апреля 2010

Для PHP <5.3 это нелегко сделать без предварительного создания экземпляра класса с <code>call_user_func_array. Однако с Reflection это довольно тривиально:

$reflection = new ReflectionClass( 'yourClassName' );
$instance = $reflection->newInstanceArgs( $yourArrayOfConstructorArguments );
0 голосов
/ 22 мая 2013

Если по какой-то причине вы не можете использовать ReflectionClass::newInstanceArgs, вот другое решение, использующее eval ():

function make_instance($class, $args) {
   $arglist = array();
   $i = 0; 
   foreach($args => &$v) {
       $arglist[] = $n = '_arg_'.$i++;
       $$n = &$v;
   }
   $arglist = '$'.implode(',$',$arglist);
   eval("\$obj = new $class($arglist);");
   return $obj;
}
$instance = make_instance('yourClassName', $yourArrayOfConstructorArguments);

Обратите внимание, что использование этой функции позволяет передавать аргументы по ссылке на конструктор, что недопустимо при ReflectionClass::newInstanceArgs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...