Eu escrevi uma função PHP que pode aceitar 10 parâmetros, mas apenas 2 são necessários. Às vezes, quero definir o oitavo parâmetro, mas não quero digitar strings vazias para cada um dos parâmetros até chegar ao oitavo.
Uma ideia que tive foi passar uma função abstrata com um array de parâmetros que a passa para a função real.
Existe uma maneira melhor de configurar a função para que eu possa passar apenas os parâmetros que desejo?
php
function
parameter-passing
user481826
fonte
fonte
Respostas:
Faça com que a função tenha um parâmetro: um array. Passe os parâmetros reais como valores na matriz.
Editar: o link no comentário de Pekka resume tudo.
fonte
O que fiz neste caso foi passar um array, onde a chave é o nome do parâmetro e o valor é o valor.
fonte
Para realizar o que você deseja, use um array como o Rabbot disse (embora isso possa se tornar uma dor de documentar / manter se usado excessivamente). Ou apenas use os argumentos opcionais tradicionais.
No entanto, eu normalmente acho que quando eu começo a escrever uma função / método com tantos argumentos - na maioria das vezes é um cheiro de código e pode ser refeito / abstraído em algo muito mais limpo.
fonte
No PHP 5.6 e posterior, as listas de argumentos podem incluir o token ... para denotar que a função aceita um número variável de argumentos. Os argumentos serão passados para a variável fornecida como um array; por exemplo:
Exemplo usando ... para acessar argumentos variáveis
O exemplo acima produzirá:
O argumento de comprimento variável lista a documentação do PHP
fonte
Você pode apenas definir o valor padrão como nulo.
fonte
null
pelos não bits do tipo de data. por exemplo,array()
para matrizesNOTA: Esta é uma resposta antiga, para PHP 5.5 e inferior. PHP 5.6+ suporta argumentos padrão
No PHP 5.5 e inferior, você pode fazer isso usando um destes 2 métodos:
Como usar
Eu prefiro o segundo método porque é claro e fácil de entender, mas às vezes você pode precisar do primeiro método.
fonte
$x = null; if ($x) echo "true"; else echo "false";
irá imprimir "false", mesmo se $ x var tiver um valor ("null" neste código). Além disso, em ambos os métodos estamos usando o operador ternário, então é correto usar apenas um "=". Se você testar commethod(); method(1); method(1, 2);
, a primeira chamada associará arg1 e arg2 aos valores padrão, a segunda chamada associará o segundo arg ao valor padrão e "1" ao primeiro arg. A última chamada não associará os valores padrão.Acho que você pode usar objetos como params-transportes também.
Claro, você deve definir os valores padrão para "optParam8" e "optParam2" nesta função, em outro caso você obterá "Aviso: Propriedade indefinida: stdClass :: $ optParam2"
Se estiver usando arrays como parâmetros de função, gosto desta maneira de definir os valores padrão:
fonte
Se apenas dois valores são necessários para criar o objeto com um estado válido, você pode simplesmente remover todos os outros argumentos opcionais e fornecer setters para eles (a menos que você não queira que eles sejam alterados no tempo de execução). Em seguida, instancie o objeto com os dois argumentos necessários e defina os outros conforme necessário por meio do setter.
Leitura adicional
fonte
Eu sei que este é um post antigo, mas eu estava tendo um problema como o OP e foi isso que eu descobri.
Exemplo de array que você poderia passar. Você poderia solicitar novamente se um pedido específico fosse necessário, mas para esta pergunta, fará o que for solicitado.
Isso é gerenciável, fácil de ler e os pontos de extração de dados podem ser adicionados e removidos em qualquer momento da codificação e ainda evitar uma reescrita em massa. Usei chaves inteiras para calcular a pergunta original do OP, mas as chaves de string podem ser usadas com a mesma facilidade. Na verdade, para facilitar a leitura, eu o aconselharia.
Cole isso em um arquivo externo para facilitar
coloque isso no início se o arquivo.
Apenas use-os para atribuir a próxima parte de dados, use numeração / nomeação de acordo com a origem dos dados.
E finalmente passe o array
fonte
Você pode fazer uma função regular e, em seguida, adicionar suas variáveis opcionais, dando-lhes um valor nulo padrão.
Um Null ainda é um valor, se você não chamar a função com um valor para aquela variável, ela não ficará vazia, então sem erro.
fonte
Se você costuma passar apenas o 8º valor, pode reordenar seus parâmetros para que seja o primeiro. Você só precisa especificar os parâmetros até o último que deseja definir.
Se estiver usando valores diferentes, você terá 2 opções.
Uma seria criar um conjunto de funções de invólucro que usem parâmetros diferentes e definam os padrões nos outros. Isso é útil se você usar apenas algumas combinações, mas pode ficar muito confuso rapidamente.
A outra opção é passar um array onde as chaves são os nomes dos parâmetros. Você pode então apenas verificar se há um valor na matriz com uma chave e, se não, usar o padrão. Mas, novamente, isso pode ficar confuso e adicionar muito código extra se você tiver muitos parâmetros.
fonte
PHP permite argumentos padrão ( link ). No seu caso, você pode definir todos os parâmetros de 3 a 8 como NULL ou como uma string vazia "" dependendo do código da função. Dessa forma, você pode chamar a função usando apenas os dois primeiros parâmetros.
Por exemplo:
fonte
echo " this is arg3: " . $arg3;
, etc., você verá que chamar egyourFunction(3, 2, $arg8=5);
irá imprimir32 this is arg3: 5
. O problema é que a posição do parâmetro ainda importa ao passar parâmetros opcionais em PHP ... nomes de parâmetro não são suficientes para mapear os valores dos parâmetros para os nomes dos parâmetros.Basta definir Null para ignorar os parâmetros que você não deseja usar e, em seguida, definir o parâmetro necessário de acordo com a posição.
fonte
fonte
default
é uma palavra - chave em PHP .