2011-12-16 18 views
8

¿Cómo puedo llamar a un constructor de objetos de pasar una serie de parámetros para que tenga:serie de parámetros a constructor de objeto

$array = array($param1, $param2); 

voy a ser capaz de llamar a

$abc = new Abc($param1, $param2); 

teniendo en cuenta que no sé cuántos parámetros podrían establecerse en la matriz. ¿Hay algo como call_object('Abc', array($param1, $param2))?

+3

¿por qué no pasar el conjunto? 'nuevo Abc ($ array)'? – ManseUK

+2

Quizás Jeff no escriba/controle esas clases ... – VolkerK

+0

@JeffPigarelli, quizás si hubiera formulado su pregunta mejor o dado más de un ejemplo, no habría obtenido tantas respuestas "incorrectas" ... – ManseUK

Respuesta

2

que Asumiendo son capaces de modificar los constructores de tus objetos, un patrón como este no es común, pero requiere matrices asociativas como entrada:

class Abc { 
    public $prop1; 
    public $prop2; 

    public function __construct($params) { 
    if (is_array($params)) { 
     $this->prop1 = isset($params['prop1']) ? $params['prop1'] : NULL; 
     $this->prop2 = isset($params['prop2']) ? $params['prop2'] : NULL; 
    } 
    } 
} 

// Created as: 
$params = array('prop1'=>12354, 'prop2'=>54321); 
$abc = new Abc($params); 
+0

This won ' t funciona si quiere usar un constructor tipado. – digitaldonkey

4

Lo ideal es definir su constructor para tomar una arra y

Si no puede hacer eso, existe una posible solución. Si todos los parámetros al constructor son opcionales, se podría hacer algo como esto con call_user_func_array:

$obj = new Abc; 
call_user_func_array(array($obj, '__construct'), $array); 

Esto se traduce en su constructor se realizará dos veces: una vez con ningún parámetro, y una vez con los de la matriz. Deberá decidir si esto es adecuado para su aplicación.

+0

Uhm! ¿Qué pasa si tu constructor Abc necesita parámetros? PHP Fatal error: Unguught ArgumentCountError: Demasiados pocos argumentos para funcionar Abc :: __ construct(), pasaron 0. Entonces no puedes instalar el objeto y luego llamar al constructor. Me falta algo? – guido

+0

@guido "Si * todos * los parámetros para el constructor son opcionales". Esta no es una buena práctica: es una solución. – lonesomeday

10

¿Qué le parece usar ... (operador splat)?

$array = array($param1, $param2); 
$abc = new Abc(...$array); // equal to: new Abc($param1, $param2) 

PHP 5.6 es necesario.

Cuestiones relacionadas