2012-08-09 10 views

risposta

10

È inoltre possibile controllare il costruttore nel codice sopra:

$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

Il percorso più semplice sarebbe utilizzare un array.

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ì, pensavo, mi stavo chiedendo se fosse possibile un altro approccio. Inoltre, il trucco property_exists() è meraviglioso, grazie mille! – Cranio

0

Non so perché, ma non mi piace utilizzando l'operatore new nel mio codice.

Ecco una funzione statica per creare un'istanza di una classe chiamata staticamente.

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 
    } 
} 

Se si utilizza dentro uno spazio dei nomi è necessario sfuggire ReflectionClass in questo modo: nuove ReflectionClass \ ...

Ora è possibile chiamare il metodo init() con un numero variabile di argomenti ed è lo passerà al costruttore e restituirà un oggetto per te.

modo normale utilizzando il nuovo

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

modo in linea con nuova

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

chiamata statico tramite init invece di nuovo

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

chiamata statico utilizzando initArray invece di nuovo

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

La cosa bella di metodi statici è che è possibile eseguire alcune operazioni di costruzione pre nei metodi init come la convalida argomento del costruttore.

Problemi correlati