Pessoalmente, não gosto de ter muitos argumentos opcionais, se puder sair ileso. Eu posso achar muito difícil de ler e quando você acaba passando coisas como
getOption($option1, "",0,"")
onde a declaração do método é realmente algo como (obviamente nomes de parâmetros reais seriam melhor nomeados)
getOption($myoption, $textStr, $numberOf, %description = "", $name = "", $typeOf = 0)
É difícil saber lendo exatamente o que são os valores e também o que você está definindo ou deixando de fora. Toda vez que quero chamar esse método, tenho que ter muito cuidado para definir os parâmetros corretos no lugar certo.
Uma alternativa possível é usar algo como o padrão Builder, no qual você está construindo os critérios que deseja adicionar explicitamente. Para aqueles parâmetros que são necessários, você faz parte do construtor. Para aqueles opcionais, você tem um método para adicionar.
Algo como:
class StudentEnrollmentCriteriaBuilder {
function __construct($id) {
// id is always required for this criteria
}
function getCriteria() {
// return the built up criteria
}
function addNameFilter($name) {
// add the name to the filter
return $this;
}
function addSexFilter($sex) {
// add sex type as a filter
return $this;
}
// etc
}
Eu acho que você poderia usá-lo como
$criteria = new StudentEnrollmentCriteriaBuilder ($id);
$query = $criteria.addNameFilter('bob').addSexFilter('M').getCriteria();
// faz coisas
Cada método seria responsável por adicionar o filtro, se válido. Então, no caso do nome, se fosse um nome vazio, você não o adicionaria como um filtro, etc., como não era necessário, ou lançaria uma exceção, etc etc
Se chegou até ele, onde há muitas propriedades eu prefiro a opção de objeto. Se alguns são obrigados, pelo menos, torná-los parte do construtor. Se você, pelo menos, tiver feito o método opcional com base, poderá adicionar a verificação de validade aos dados nesse ponto ou deixar que o usuário faça o mesmo.
Apenas meus 1 1/2 centavos.