Я ищу лучший способ иметь статический метод создания на абстрактном уровне в семействе классов, который может иметь переменное число аргументов в конструкторе.
Например, если я знаю, что все расширенные версии 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]);
}
}
Но как насчет случая, когда конструктор не определен и число аргументов может варьироваться:
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....
}
}