Я часто реализую этот подход, когда аргументы функции> 2, вместо того, чтобы в конечном итоге получить рождественский список аргументов, который должен быть в определенном порядке, я просто передаю ассоциативный массив. Передавая ассоциативный массив, я могу проверять необходимые и необязательные аргументы и обрабатывать пропущенные значения по мере необходимости. Что-то вроде:
class MyClass
{
protected $requiredArg1;
protected $optionalArg1;
public function __construct(array $options = array())
{
// Check for a necessary arg
if (!isset($options['requiredArg1'])) {
throw new Exception('Missing requiredArg1');
}
// Now I can just localize
$requiredArg1 = $options['requiredArg1'];
$optionalArg1 = (isset($options['optionalArg1'])) ? $options['optionalArg1'] : null;
// Now that you have localized args, do what you want
$this->requiredArg1 = $requiredArg1;
$this->optionalArg1 = $optionalArg1;
}
}
// Example call
$class = 'MyClass';
$array = array('requiredArg1' => 'Foo!', 'optionalArg1' => 'Bar!');
$instance = new $class($array);
var_dump($instance->getRequiredArg1());
var_dump($instance->getOptionalArg1());
Я настоятельно рекомендую использовать ассоциативный массив, однако можно использовать массив с 0 индексами. Вы должны быть предельно осторожны при создании массива и учитывать индексы, которые имеют значение, иначе вы передадите массив со смещенными аргументами и разрушите вашу функцию.