2012-08-09 16 views

cevap

10

Ayrıca yukarıdaki kodda yapıcısı inceleyebilirsiniz:

$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

En kolay yol bir dizi kullanmak olacaktır.

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

Evet, bunun hakkında bir düşüncenin mümkün olup olmadığını merak ediyordum. Ayrıca, property_exists() trick harika, çok teşekkürler! – Cranio

0

Nedenini bilmiyorum ama benim kodunda yeni operatörünü kullanarak sevmiyorum.

Statik olarak adlandırılan bir sınıf örneğini oluşturmak için statik bir işlev.

Şimdi

Eğer argümanları ve bunun bir değişken sayısı ile init() yöntemini çağırabilirsiniz ... yeni \ ReflectionClass:

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

Bir sen şöyle ReflectionClass kaçmak için gereken ad içine kullanıyorsanız onu yapıcıya iletecek ve sizin için bir nesne döndürecektir. Yeni

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

Statik çağrısı kullanarak yeni

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

Inline yolu kullanarak

Normal yolu yerine yeni

echo ClassName::init('arg1', 'arg2', 'arg3')->method1()->method2(); 
arasında init kullanarak yerine yeni

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

statik yöntemleri hakkında güzel bir şey arasında initArray kullanılarak

Statik çağrı Böyle yapıcı argüman doğrulama olarak init yöntemlerinde bazı ön inşaat işlemleri çalıştırmak olabilir.

İlgili konular