Статический создатель с переменным числом аргументов - PullRequest
1 голос
/ 15 апреля 2010

Я ищу лучший способ иметь статический метод создания на абстрактном уровне в семействе классов, который может иметь переменное число аргументов в конструкторе.

Например, если я знаю, что все расширенные версии 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....
    }
}

1 Ответ

1 голос
/ 15 апреля 2010

Самый простой способ сделать это - использовать систему 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...