Мне очень нравится шаблон проектирования "массивов опций".Если бы PHP поддерживал расширение аргументов Python, я бы согласился с длинным списком параметров.Но я просто нахожу foo(1, 2, 'something', true, 23, array(4), $bar);
ДЕЙСТВИТЕЛЬНО нечитаемым.Обычно я буду использовать массивы, когда нужно установить более 3 или 4 параметров ...
Я бы посоветовал «очистить» конструктор, создав защищенный метод для доступа к конфигурационным переменным.(предпочтительно в базовом классе):
abstract class Configurable {
protected $options = array();
protected $requiredOptions = array();
public function __construct(array $options = array()) {
$this->options = $options;
foreach ($this->requiredOptions as $option) {
if (!isset($this->options[$option])) {
throw new InvalidArgumentException('Required argument [$'.$option.'] was not set');
}
}
}
protected function _getOption($key, $default = null) {
return isset($this->options[$key]) ? $this->options[$key] : $default;
}
}
Затем в вашем классе вы можете перегрузить массив requireOptions, чтобы определить вещи, которые нужно установить
class Foo extends Configurable {
protected $requiredOptions = array(
'db',
'foo',
);
public function __construct(array $options = array()) {
parent::__construct($options);
if ($this->_getOption('bar', false)) {
//Do Something
}
}
}
Одна вещь. Если вы сделаете это, ПОЖАЛУЙСТА, документируйте необходимые параметры.Тем, кто последует за вами, станет намного легче.