OK, eu esqueci totalmente como pular argumentos no PHP.
Digamos que tenho:
function getData($name, $limit = '50', $page = '1') {
...
}
Como eu chamaria essa função para que o parâmetro do meio receba o valor padrão (ou seja, '50')?
getData('some name', '', '23');
O acima está correto? Não consigo fazer isso funcionar.
php
function
parameters
default-value
optional-parameters
Chuck Le Butt
fonte
fonte
ReflectionFunction
. Eu postei essa resposta em uma pergunta semelhante.Respostas:
Sua postagem está correta.
Infelizmente, se você precisar usar um parâmetro opcional no final da lista de parâmetros, você deve especificar tudo até o último parâmetro. Geralmente, se você deseja misturar e combinar, você dá a eles os valores padrão de
''
ounull
e não os usa dentro da função se eles forem esse valor padrão.fonte
$limit = is_numeric($limit) ? $limit : '50';
no início do getData funçãoNão há maneira de "pular" um argumento a não ser para especificar um padrão como
false
ounull
.Uma vez que o PHP carece de algum açúcar sintático quando se trata disso, você frequentemente verá algo assim:
Que, como eloqüentemente disse nos comentários, é usar matrizes para emular argumentos nomeados.
Isso oferece flexibilidade máxima, mas pode não ser necessário em alguns casos. No mínimo, você pode mover tudo o que acha que não é esperado na maioria das vezes para o final da lista de argumentos.
fonte
Não, não é possível ignorar argumentos dessa maneira. Você pode omitir a passagem de argumentos apenas se eles estiverem no final da lista de parâmetros.
Havia uma proposta oficial para isso: https://wiki.php.net/rfc/skipparams , que foi recusada. A página da proposta tem links para outras perguntas do OE sobre este tópico.
fonte
Nada mudou em relação à capacidade de ignorar argumentos opcionais, no entanto, para a sintaxe correta e para poder especificar NULL para argumentos que desejo ignorar, é assim que eu faria:
Isso pode ser chamado da seguinte maneira:
getData('some name',NULL,'23');
e qualquer pessoa que chamar a função no futuro não precisará se lembrar dos padrões todas as vezes ou da constante declarada para eles.fonte
A resposta simples é não . Mas por que pular quando reorganizar os argumentos consegue isso?
O seu é um " Uso incorreto de argumentos de função padrão " e não funcionará como você espera.
Uma observação lateral da documentação do PHP:
Considere o seguinte:
O resultado será:
O uso correto dos argumentos da função padrão deve ser assim:
O resultado será:
Colocar o padrão à sua direita após os não padrões garante que sempre executará novamente o valor padrão para aquela variável se não estiver definido / fornecido. Aqui está um link para referência e de onde esses exemplos vieram.
Editar: configurá-lo
null
como os outros estão sugerindo pode funcionar e é outra alternativa, mas pode não ser o que você deseja. Ele sempre definirá o padrão como nulo se não estiver definido.fonte
Para qualquer parâmetro ignorado (você tem que) ir com o parâmetro padrão, para estar no lado seguro.
(Se decidir por nulo, onde o parâmetro padrão é '' ou semelhante ou vice-versa, você terá problemas ...)
fonte
Conforme mencionado acima, você não poderá ignorar os parâmetros. Escrevi esta resposta para fornecer algum adendo, que era muito grande para incluir em um comentário.
@Frank Nocke propõe chamar a função com seus parâmetros padrão, por exemplo, tendo
você deveria usar
que funcionalmente será o mesmo que omitir os dois primeiros parâmetros (
$b
e$c
).Não está claro quais são os padrões (é
0
digitado para fornecer o valor padrão ou é importante?).Também existe o perigo de que o problema dos valores padrão esteja conectado a uma função externa (ou embutida), quando os valores padrão podem ser alterados pelo autor da função (ou método). Portanto, se você não mudasse sua chamada no programa, poderia mudar acidentalmente seu comportamento.
Uma solução alternativa poderia ser definir algumas constantes globais, como
DEFAULT_A_B
qual seria "valor padrão do parâmetro B da função A" e "omitir" os parâmetros desta forma:Para classes é mais fácil e elegante se você definir constantes de classe, porque elas fazem parte do escopo global, por exemplo.
Observe que essa constante padrão é definida exatamente uma vez em todo o código (não há valor mesmo na declaração do método), portanto, no caso de algumas alterações inesperadas, você sempre fornecerá a função / método com o valor padrão correto.
A clareza desta solução é obviamente melhor do que fornecer valores padrão brutos (como
NULL
,0
etc.) que não dizem nada ao leitor.(Concordo que ligar como
$var = a(,,'ddd');
seria a melhor opção)fonte
Você não pode pular argumentos, mas pode usar parâmetros de array e precisa definir apenas 1 parâmetro, que é um array de parâmetros.
E você pode adicionar quantos parâmetros você precisar, você não precisa defini-los. Ao chamar a função, você coloca seus parâmetros como este:
fonte
Bem, como todo mundo já disse, o que você quer não será possível em PHP sem adicionar linhas de código na função.
Mas você pode colocar este pedaço de código no topo de uma função para obter sua funcionalidade:
Então, basicamente
debug_backtrace()
, consigo o nome da função na qual este código é colocado, para então criar um novoReflectionFunction
objeto e fazer um loop por todos os argumentos da função.No loop, eu simplesmente verifico se o argumento da função é
empty()
AND se o argumento é "opcional" (significa que tem um valor padrão). Se sim, simplesmente atribuo o valor padrão ao argumento.Demo
fonte
Defina o limite como nulo
e chamar essa função
se você quiser definir o limite, você pode passar como um argumento
fonte
Conforme recomendado anteriormente , nada mudou. Cuidado, porém, muitos parâmetros (especialmente os opcionais) são um forte indicador do cheiro do código.
Talvez sua função esteja fazendo muito:
Alguns parâmetros podem ser agrupados logicamente:
Em último recurso, você sempre pode introduzir um objeto de parâmetro ad-hoc :
(que é apenas uma versão glorificada da técnica de array de parâmetros menos formal )
Às vezes, o próprio motivo para tornar um parâmetro opcional está errado. Neste exemplo, é
$page
realmente opcional? Salvar alguns personagens realmente faz diferença?fonte
Este trecho:
A resposta é :
fonte
Isso é o que eu faria:
Espero que isso ajude alguém
fonte
Essa é uma pergunta meio antiga com várias respostas tecnicamente competentes, mas clama por um dos padrões de design modernos em PHP: Programação Orientada a Objetos. Em vez de injetar uma coleção de tipos de dados escalares primitivos, considere o uso de um "objeto injetado" que contém todos os dados necessários para a função. http://php.net/manual/en/language.types.intro.php
O objeto injetado pode ter rotinas de validação de propriedade, etc. Se a instanciação e injeção de dados no objeto injetado não for capaz de passar toda a validação, o código pode lançar uma exceção imediatamente e o aplicativo pode evitar o processo estranho de lidar com dados potencialmente incompletos.
Podemos sugerir o tipo de objeto injetado para detectar erros antes da implantação. Algumas das idéias são resumidas neste artigo de alguns anos atrás.
https://www.experts-exchange.com/articles/18409/Using-Named-Parameters-in-PHP-Function-Calls.html
fonte
Tive que fazer uma fábrica com parâmetros opcionais, minha solução alternativa foi usar o operador de coalescência nulo:
Uso:
Não é a coisa mais bonita, mas pode ser um bom padrão para usar em fábricas para testes.
fonte
Experimente isso.
fonte
Você não pode pular o parâmetro do meio em sua chamada de função. Mas você pode contornar isso:
Função:
fonte
Como @IbrahimLawal apontou. É uma prática recomendada apenas defini-los com
null
valores. Apenas verifique se o valor passado é aquelenull
em que você usa seus padrões definidos.Espero que isto ajude.
fonte
apenas não os passe e o valor padrão será aceito
fonte