У меня есть функция, которая принимает вариативные аргументы, которые я func_get_args()
от func_get_args()
.
Эта функция должна вызывать конструктор с этими аргументами. Однако я не знаю, как это сделать.
С помощью call_user_func
вы можете вызывать функции с массивом аргументов, но как вы могли бы назвать его конструктором? Я не могу просто передать массив аргументов; он должен верить, что я назвал его «нормально».
Спасибо!
Для PHP <5.3 это непросто сделать без предварительного создания экземпляра класса с помощью call_user_func_array
. Однако с Reflection
это довольно тривиально:
$reflection = new ReflectionClass( 'yourClassName' ); $instance = $reflection->newInstanceArgs( $yourArrayOfConstructorArguments );
Если по какой-то причине вы не можете использовать 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
.