我正在寻找在类家族中在抽象级别拥有静态创建方法的最佳方法,该类可以在构造函数中具有可变数量的参数。
例如,如果我知道Foo的所有扩展版本都有两个构造函数参数,我可以这样做:
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....
}
}
答案 0 :(得分:1)
最简单的方法是使用Reflection系统。
$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);