Eu já tive esse tipo de debate filosófico comigo antes. Aqui é onde estou na maior parte do tempo, embora perceba que essa é uma resposta baseada em opinião:
Uma coisa que vejo que pode ajudar a responder à pergunta é a passagem de $ params, que pode ou não ter atributos / membros de matriz definidos.
Ao longo dos anos, cheguei a esta conclusão:
Evite a passagem de matrizes.
Por quê? Bem, não há como definir ou ter valores de sentinela definidos para argumentos passados opcionais.
Em outras palavras, com o código especificado, você não pode fazer algo assim:
function __construct($arg1 = NULL, $arg2 = DEFAULT_VAL) {
$this->arg1 = $arg1;
$this->arg2 = $arg2;
}
$ arg1 e $ arg2 são argumentos opcionais - se não forem passados, têm NULL e DEFAULT_VAL respectivamente - não há necessidade de verificar explicitamente.
Talvez isso pareça meio arbitrário.
Eu acho que entendo o que você está tentando realizar - a aprovação de uma única referência em oposição a toneladas de argumentos. Isso me leva à minha próxima conclusão:
Se não passar variáveis "atômicas" (cadeias, números inteiros, literais), passe objetos.
Existem benefícios de desempenho aqui, pois a passagem de objetos é feita por referência (embora as matrizes sejam as mesmas no PHP).
Então você pode fazer algo como:
function __construct(MyAwesomeObject $oArg) {
$this->oArg = $oArg;
}
O argumento do objeto passado teria a garantia de ter "property1", "property2", embora possivelmente com os próprios valores padrão.
Além disso, aqui você pode digitar dica e um bom IDE também sugerirá corretamente a conclusão do código.
Mas rapidamente percebemos que temos uma coisa de galinha e ovo: você está construindo um objeto com argumentos passados que precisam ser construídos em algum momento.
Então, onde isso nos deixa? Bem, cheguei à conclusão de que, eventualmente, todas as classes se destilam para, por falta de um termo melhor, variáveis "atômicas" (strings, floats, dobros, ints, recursos que você entende) e que eu tento para construir todas as classes com esses tipos ou objetos variáveis - mas não matrizes.
Então eu respondi sua pergunta? provavelmente não exatamente. Mas espero ter ilustrado algo útil, embora um pouco estilístico. Eu acho que o código é um pouco mais limpo, mais legível e mais barato.
Agora, isso não quer dizer que você não deve higienizar sua entrada. Essa é outra discussão inteiramente.
Espero que isto ajude.
new object($param1,-some default value so I can specify the next parameter-, $param3);
e por isso você tem seus valores padrão codificados em vários lugares diferentes