Si separar instancias de la inicialización no es estrictamente un requisito, existen otras dos posibilidades: primero, un método de fábrica estático.
class Test {
public function __construct($param1, $param2, $param3) {
echo $param1.$param2.$param3;
}
public static function CreateTest($param1, $param2, $param3) {
return new Test($param1, $param2, $param3);
}
}
$params = array('p1','p2','p3');
if(method_exists($ob,'__construct')) {
call_user_func_array(array($ob,'CreateTest'),$params);
}
O, si usted está usando PHP 5.3.0 o superior, se puede utilizar un lambda:
class Test {
public function __construct($param1, $param2, $param3) {
echo $param1.$param2.$param3;
}
}
$params = array('p1','p2','p3');
$func = function ($arg1, $arg2, $arg3) {
return new Test($arg1, $arg2, $arg3);
}
if(method_exists($ob,'__construct')) {
call_user_func_array($func, $params);
}
El método de inicialización descrito por Asaf es grande si por alguna razón usted tiene una necesidad para separar lógicamente la inicialización de la creación de instancias, pero si respaldar su caso de uso anterior es un caso especial, no un requisito regular, puede ser inconveniente solicitar a los usuarios que creen e inicialicen su objeto en dos pasos separados.
El método de fábrica es bueno porque le da un método para llamar para obtener una instancia inicializada. Sin embargo, el objeto se inicializa y crea una instancia en la misma operación, por lo que si necesita separar los dos, no funcionará.
Y, por último, recomiendo la lambda si este mecanismo de inicialización se utiliza de forma poco común, y no quiere complicar la definición de clase con métodos de inicialización o de fábrica que casi nunca se utilizarán.
tenga en cuenta que si los parámetros del constructor son pasados por referencia, entonces call_user_func_array fallará !! – Sarfraz