2010-04-15 111 views
1

我正在尋找在類系列中的抽象級別具有靜態創建方法的最佳方法,該類可以在構造函數中具有可變數量的參數。具有可變數量參數的靜態創建器

例如,如果我知道,富的所有擴展版本將有兩個構造函數的參數,我可以這樣做:

abstract class Foo { 
    abstract public function __construct($arg1,$arg2); 
    public static function Create(){ 
     $args = func_get_args(); 
     if(count($agrs)!=2) throw new Exception('Invalid number of arguments'); 
     $classname = __CLASS__; 
     return new $classname($args[0],$args[1]); 
    } 
} 

又是如何在構造函數中沒有定義的情況下和argumunts數量可以有所不同:

abstract class Foo { 
    public static function Create(){ 
     $args = func_get_args(); 
     $classname = __CLASS__; 
     return new $classname($args[0],$args[1],$args[2]); //errors if less than 3 arguments were passed 
    } 
} 

class Foo_1 extends Foo { 
    public function __construct($arg1){ 
     //some code... 
    } 
} 

class Foo_2 extends Foo { 
    public function __construct($arg1,$arg2,$arg3){ 
     //some code... 
    } 
} 

我能想出的最好是測試過這樣的論點:

public static function Create(){ 
    $args = func_get_args(); 
    $classname = __CLASS__; 
    switch count($args){ 
     case 0: return new $classname(); 
     case 1: return new $classname($args[0]); 
     case 2: return new $classname($args[0],$args[1]); 
     //etc.... 
    } 
} 

回答

1

最簡單的方法是使用反射系統。

$reflector = new ReflectionClass($className); 
$args = array('foo', 'bar'); 
// $instance will be an instance of $className 
// $args should be an array containing the arguments to 
// pass to the constructor 
$instance = $reflector->newInstanceArgs($args); 
+0

謝謝awgy我會檢查出來。我已經忘記了反思。 – hendepher 2010-04-15 18:48:30