2012-08-09 14 views

Antwort

10

Sie können auch den Konstruktor in dem obigen Code überprüfen:

$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

Der einfachste Weg wäre die Verwendung eines Arrays.

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

Ja, darüber nachgedacht, ich habe mich nur gefragt, ob ein anderer Ansatz möglich war. Außerdem ist der Trick von property_exists() wunderbar, vielen Dank! – Cranio

0

Ich weiß nicht, warum, aber Ich mag nicht die neuen Betreiber in meinem Code.

Hier ist eine statische Funktion zum Erstellen einer Instanz einer Klasse namens statisch.

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

Wenn Sie es in einem Namespace Sie Reflection wie so entkommen müssen verwenden: neue \ Reflection ...

Jetzt können Sie die Methode init() mit einer variablen Anzahl von Argumenten aufrufen und wird es an den Konstruktor übergeben und ein Objekt für Sie zurückgeben.

Normalweg neue

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

Inline Art und Weise mit neuen

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

statischen Aufruf statt neuer

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

statischen Aufruf initarray statt neuer

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

Die nette Sache über die statischen Methoden ist, dass Sie einige Pre Baubetrieb in den init Methoden wie Konstruktorargument Validierung ausgeführt werden können.

Verwandte Themen