2012-08-09 19 views

Odpowiedz

10

Można także sprawdzić konstruktora w powyższym kodzie:

$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

Najprostszą trasą byłoby użycie tablicy.

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

Tak, pomyślałem o tym, zastanawiałem się tylko, czy możliwe jest inne podejście. Poza tym sztuczka property_exists() jest cudowna, bardzo dziękuję! – Cranio

0

Nie wiem dlaczego, ale nie lubię za pomocą nowego operatora w moim kodu.

Oto statyczna funkcja do utworzenia instancji klasy o nazwie statycznie.

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

Jeśli używasz go wewnątrz przestrzeni nazw trzeba uciec ReflectionClass tak: new \ ReflectionClass ...

Teraz można wywołać metodę init() ze zmienną liczbą argumentów i to przekaże go do konstruktora i zwróci obiekt dla ciebie.

normalny sposób przy użyciu nowego

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

Inline sposób za pomocą nowego

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

Static połączenia korzystając z Init zamiast nowego

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

Static połączenia za pomocą initArray zamiast nowego

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

Zaletą metod statycznych jest to, że można uruchomić kilka wstępnych prac budowlanych w metodach startowych takich jak walidacji argument konstruktora.

Powiązane problemy