Вызов конструктора из переменных аргументов с помощью PHP

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

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

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

Спасибо!

 David24 июл. 2017 г., 11:40
Начиная с PHP 5.6 вы можете использоватьраспаковка аргумента: new SomeClass( ... [ 'arg1', 'arg2' ] );

Ответы на вопрос(2)

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

function make_instance($class, $args) {
   $arglist = array();
   $i = 0; 
   foreach($args => &$v) {
       $arglist[] = $n = '_arg_'.$i++;
       $n = &$v;
   }
   $arglist = '

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

.implode(',

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

,$arglist); eval("\$obj = new $class($arglist);"); return $obj; } $instance = make_instance('yourClassName', $yourArrayOfConstructorArguments);

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

 DUzun15 авг. 2017 г., 09:45
Что не так с этим ответом? Любые комментарии? Это только из-заeval? Я четко заявил в начале, это альтернативное решение, использующееeval
Решение Вопроса

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

$reflection = new ReflectionClass( 'yourClassName' );
$instance = $reflection->newInstanceArgs( $yourArrayOfConstructorArguments );
 Lotus Notes14 апр. 2010 г., 21:11
Спасибо за пример. Вероятно, это первое, что я нашел в руководстве по PHP, которое не очень хорошо объяснено.
 zneak14 апр. 2010 г., 21:08
Еще одна особенность PHP 5.3, о которой я не знал. Спасибо, он это сделает.
 salathe14 апр. 2010 г., 21:15
@zneak,ReflectionClass::newInstanceArgs не является новым в PHP 5.3, у нас это было примерно с 2006 года, когда он был выпущен с PHP 5.1.3. @byronh, есть что-то конкретное, что вы нашли плохо объясненным, или вы ссылаетесь на части, помеченные как «недокументированные»? (Не стесняйтесь, напишите мне, [email protected])
 Decent Dabbler14 апр. 2010 г., 21:18
@salathe: +1 точно. Это было то, что я пытался донести.

Ваш ответ на вопрос