2010-04-14 9 views
12

Ich habe eine Funktion, die variadic Argumente, die ich von func_get_args() erhalten.Rufen Sie einen Konstruktor aus Variablenargumente mit PHP

Diese Funktion muss einen Konstruktor mit diesen Argumenten aufrufen. Ich weiß jedoch nicht, wie ich es machen soll.

Mit call_user_func können Sie Funktionen mit einem Array von Argumenten aufrufen, aber wie würden Sie einen Konstruktor daraus nennen? Ich kann das Array von Argumenten nicht einfach übergeben; es muss glauben, dass ich es "normal" genannt habe.

Vielen Dank!

+0

Seit PHP 5.6 können Sie _argument entpacken_ verwenden: 'new SomeClass (... ['arg1', 'arg2']);' – David

Antwort

20

Für PHP < 5.3 ist es nicht leicht machbar, ohne zuerst eine Instanz der Klasse mit call_user_func_array zu erstellen. Jedoch mit Reflection ist dies ziemlich trivial:

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

Ein weiteres Feature von PHP 5.3 war mir nicht bekannt. Danke, es wird es tun. – zneak

+1

Vielen Dank für das Beispiel. Dies ist wahrscheinlich das erste Ding im PHP-Handbuch, das ich gefunden habe, wurde nicht sehr gut erklärt. –

+5

@zneak, 'ReflectionClass :: newInstanceArgs' ist nicht neu in PHP 5.3, wir hatten es seit 2006, als es mit PHP 5.1.3 veröffentlicht wurde. @byronh, gibt es etwas Besonderes, das Sie nicht gut erklärt haben oder beziehen Sie sich auf die Teile, die als "undokumentiert" gekennzeichnet sind? (Fühlen Sie sich frei, mich zu mailen, [email protected]) – salathe

-2

Wenn aus irgendeinem Grund nicht ReflectionClass::newInstanceArgs verwenden hier eine andere Lösung mit 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); 

Beachten Sie, dass mit dieser Funktion ermöglicht es Ihnen, Argumente zu übergeben durch Bezugnahme auf den Konstruktor, was unter ReflectionClass::newInstanceArgs nicht akzeptabel ist.

+0

Was ist falsch an dieser Antwort? Irgendwelche Kommentare? Ist es nur wegen 'eval'? Ich habe zu Beginn klar gesagt, dass dies eine alternative Lösung ist, die 'eval' verwendet – DUzun

Verwandte Themen