2010-04-14 16 views
12

Ho una funzione che accetta argomenti variadici, che ottengo da func_get_args().Chiama un costruttore da argomenti variabili con PHP

Questa funzione deve chiamare un costruttore con tali argomenti. Tuttavia, non so come farlo.

Con call_user_func, è possibile chiamare funzioni con una matrice di argomenti, ma come si chiama un costruttore da esso? Non posso semplicemente passare l'array di argomenti ad esso; deve credere che l'ho chiamato "normalmente".

Grazie!

+0

Dal PHP 5.6 è possibile utilizzare _argument unpacking_: 'new SomeClass (... ['arg1', 'arg2']);' – David

risposta

20

Per PHP < 5.3 non è facilmente eseguibile senza prima creare un'istanza della classe con call_user_func_array. Tuttavia, con Reflection questo è abbastanza banale:

$reflection = new ReflectionClass('yourClassName'); 
$instance = $reflection->newInstanceArgs($yourArrayOfConstructorArguments); 
+0

Un'altra funzionalità di PHP 5.3 di cui non ero a conoscenza. Grazie, lo farà. – zneak

+1

Grazie per l'esempio. Questa è probabilmente la prima cosa nel manuale PHP che ho trovato non è stata spiegata molto bene. –

+5

@zneak, 'ReflectionClass :: newInstanceArgs' non è nuovo in PHP 5.3, lo abbiamo visto in giro dal 2006 quando è stato rilasciato con PHP 5.1.3. @ byronh, c'è qualcosa in particolare che hai trovato non ben spiegato o ti riferisci alle parti etichettate come "non documentate"? (Non esitate a scrivermi, [email protected]) – salathe

-2

Se per qualche motivo non è possibile utilizzare ReflectionClass::newInstanceArgs Ecco un'altra soluzione con 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); 

Nota che l'utilizzo di questa funzione consente di passare gli argomenti in riferimento al costruttore, che non è accettabile con ReflectionClass::newInstanceArgs.

+0

Cosa c'è di sbagliato in questa risposta? Qualche commento? E 'solo per 'eval'? Ho chiaramente affermato all'inizio che questa è una soluzione alternativa che usa 'eval' – DUzun

Problemi correlati