2012-08-09 17 views

Respuesta

10

También puede inspeccionar el constructor en el código anterior:

$constructorRefl = $refl->getMethod("__construct"); 

print_r($constructorRefl->getParameters()); 

/* 
Array 
(
    [0] => ReflectionParameter Object 
     (
      [name] => a 
     ) 

    [1] => ReflectionParameter Object 
     (
      [name] => b 
     ) 

    [2] => ReflectionParameter Object 
     (
      [name] => c 
     ) 

) 
*/ 
1

La ruta más fácil sería usar una matriz.

public function __construct($args = array()) 
{ 
    foreach($array as $k => $v) 
    { 
    if(property_exists('myClass', $k)) // where myClass is your class name. 
    { 
     $this->{$k} = $v; 
    } 
    } 
} 
+0

Sí, pensé en eso, me preguntaba si era posible otro enfoque. Además, el truco de property_exists() es maravilloso, ¡muchas gracias! – Cranio

0

No sé por qué, pero que no me gusta usar el nuevo operador en mi código.

Aquí hay una función estática para crear una instancia de una clase llamada estáticamente.

class ClassName { 
    public static function init(){  
     return (new ReflectionClass(get_called_class()))->newInstanceArgs(func_get_args());   
    } 

    public static function initArray($array=[]){  
     return (new ReflectionClass(get_called_class()))->newInstanceArgs($array);   
    } 

    public function __construct($arg1, $arg2, $arg3){ 
     ///construction code 
    } 
} 

Si lo están utilizando dentro de un espacio de nombres que necesita para escapar ReflectionClass así: nuevos ReflectionClass \ ...

Ahora se puede llamar al método init() con un número variable de argumentos y se lo pasará al constructor y devolverá un objeto para usted.

manera normal utilizando las nuevas

$obj = new ClassName('arg1', 'arg2', 'arg3'); 
echo $obj->method1()->method2(); 

forma en línea utilizando las nuevas

echo (new ClassName('arg1', 'arg2', 'arg3'))->method1()->method2(); 

llamada estática con init en lugar de nueva

echo ClassName::init('arg1', 'arg2', 'arg3')->method1()->method2(); 

llamada estática con initArray vez de nuevo

echo ClassName::initArray(['arg1', 'arg2', 'arg3'])->method1()->method2(); 

Lo bueno de los métodos estáticos es que se puede ejecutar algunas operaciones de pre construcción en los métodos de arranque como la validación argumento del constructor.

Cuestiones relacionadas