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