2010-04-14 4 views
12

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

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

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

Спасибо!

+0

С PHP 5.6 вы можете использовать _argument unpacking_: 'new SomeClass (... ['arg1', 'arg2']);' – David

ответ

20

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

$reflection = new ReflectionClass('yourClassName'); 
$instance = $reflection->newInstanceArgs($yourArrayOfConstructorArguments); 
+0

Еще одна особенность PHP 5.3, о которой я не знал. Спасибо, он это сделает. – zneak

+1

Благодарим вас за пример. Вероятно, это первое, что я нашел в руководстве PHP, не очень хорошо объяснено. –

+5

@zneak, 'ReflectionClass :: newInstanceArgs' не является новым в PHP 5.3, мы его использовали с 2006 года, когда он был выпущен с PHP 5.1.3. @byronh, есть ли что-нибудь в частности, что вы нашли не совсем объяснимым или вы имеете в виду части, обозначенные как «недокументированные»? (Не стесняйтесь писать мне по электронной почте, [email protected]) – salathe

-2

Если по каким-то причинам вы не можете использовать 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.

+0

Что не так с этим ответом? Любые комментарии? Это просто из-за 'eval'? Я четко заявил, что это альтернативное решение, использующее 'eval' – DUzun

Смежные вопросы