PHP

2010-04-14 8 views
12

ile değişken bağımsız değişkenlerden bir yapıcı çağırın. func_get_args()'dan elde ettiğim değişkenlikli argümanlar alan bir işlevim var.PHP

Bu işlev, bu argümanlarla bir kurucu çağırmalıdır. Ancak, nasıl yapacağımı bilmiyorum.

call_user_func ile işlevleri bir dizi argüman ile çağırabilirsiniz, ancak bir kurucudan nasıl çağırırsınız? Sadece argüman dizisini ona geçiremem; "normal" dediğime inanmalıyım.

Teşekkür ederiz!

+0

PHP 5.6'dan beri _argument unpacking_ kullanabilirsiniz: 'new SomeClass (... ['arg1', 'arg2']); – David

cevap

20

PHP için < 5.3 ilk olarak call_user_func_array ile sınıfın bir örneğini oluşturmadan kolayca yapılamaz. Ancak Reflection ile bu hayli abes:

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

PHP 5.3'ün bir diğer özelliği de farkında değildim. Teşekkürler, yapacak. – zneak

+1

Örnek için teşekkür ederiz. Bu muhtemelen, PHP el kitabındaki ilk şeyin çok iyi açıklanmadığını belirtti. –

+5

@zneak, 'ReflectionClass :: newInstanceArgs' PHP 5.3'te yeni değil, 2006'dan bu yana PHP 5.1.3 ile piyasaya sürüldüğünden beri olduk. @byronh, özellikle iyi açıklanmayan veya "belgelenmemiş" olarak etiketlenen parçalara atıfta bulunduğunuz herhangi bir şey var mı? (Bana e-posta göndermek için çekinmeyin, [email protected]) – salathe

-2

nedense burada ReflectionClass::newInstanceArgs kullanmak başka bir çözüm kullanarak eval() 'dir yapamıyorsanız: Bu işlevi kullanarak argümanları geçmesine olanak verecek

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); 

Not ReflectionClass::newInstanceArgs ile kabul edilmeyen yapıcıya referansla.

+0

Bu cevabın nesi yanlış? Herhangi bir yorum? Sadece 'eval' yüzünden mi? Başlangıçta açıkça belirttim, bu “eval” kullanarak alternatif bir çözüm. – DUzun