Eu preciso ser capaz de chamar uma função, mas o nome da função é armazenado em uma variável, isso é possível? por exemplo:
função foo () { // código aqui } barra de funções () { // código aqui } $ functionName = "foo"; // preciso chamar a função com base no que é $ functionName
php
dynamic-function
Lagarto
fonte
fonte
is_callable
função. Ele irá verificar se uma variável contém algo que pode ser chamado como uma função de (ser-lhe o nome de uma função, uma matriz que contém uma instância de objecto e um nome de função, ou uma função / fecho anónimo)call_user_func(array('ClassName', 'method'), $args)
Minha versão favorita é a versão embutida:
Você também pode colocar variáveis ou expressões dentro dos colchetes!
fonte
{"functionName"}();
não é legal e gera um erro de sintaxe.Sim, é possível:
Fonte: http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2
fonte
Como já mencionado, existem algumas maneiras de conseguir isso, possivelmente com o método mais seguro
call_user_func()
ou, se necessário, você também pode seguir o caminho$function_name()
. É possível passar argumentos usando esses dois métodos, assimSe a função que você está chamando pertencer a um objeto, você ainda poderá usar um destes
No entanto, se você usar o
$function_name()
método, pode ser uma boa ideia testar a existência da função se o nome for dinâmico de alguma formafonte
Caso alguém seja trazido aqui pelo google porque eles estavam tentando usar uma variável para um método dentro de uma classe, a seguir é um exemplo de código que realmente funcionará. Nenhuma das opções acima funcionou para a minha situação. A principal diferença está
&
na declaração$c = & new...
e&$c
na transmissãocall_user_func
.Meu caso específico é ao implementar o código de alguém que tem a ver com cores e métodos de dois membros
lighten()
edarken()
da classe csscolor.php. Por qualquer motivo, eu queria que o mesmo código pudesse chamar clarear ou escurecer, em vez de selecioná-lo com lógica. Esse pode ser o resultado da minha teimosia em não apenas usar if-else ou alterar o código que chama esse método.Observe que tentar algo com
$c->{...}
não funcionou. Ao ler atentamente o conteúdo fornecido pelo leitor na parte inferior da página do php.net, pude juntar os itenscall_user_func
acima. Além disso, observe que,$params
como uma matriz não funcionou para mim:Essa tentativa acima daria um aviso sobre o método que espera um segundo argumento (por cento).
fonte
Alguns anos atrasado, mas esta é a melhor maneira agora imho:
fonte
Por uma questão de integridade, você também pode usar eval () :
No entanto,
call_user_func()
é o caminho certo.fonte
eval
não é uma solução para esta pergunta.Solução: Use PHP7
Nota: Para uma versão resumida, consulte TL; DR no final da resposta.
Métodos antigos
Atualização : um dos métodos antigos explicados aqui foi removido. Consulte outras respostas para obter explicação sobre outros métodos, que não são abordados aqui. A propósito, se esta resposta não ajudar, você deve retornar atualizando suas coisas. O suporte ao PHP 5.6 terminou em janeiro de 2019 (agora nem o PHP 7.0 e 7.1 estão sendo suportados). Veja as versões suportadas para mais informações.
Como já mencionado, no PHP5 (e também em versões mais recentes como o PHP7), poderíamos usar variáveis como nomes de funções, use
call_user_func()
ecall_user_func_array()
(que, pessoalmente, odeio essas funções), etc.Novos Métodos
A partir do PHP7, existem novas maneiras introduzidas:
Nota: Tudo
<something>
entre parênteses significa uma ou mais expressões para formar algo, por exemplo<function_name>
significa formar um nome de função.Chamada de Função Dinâmica: Nome da Função On-the-fly
Podemos usar uma ou mais expressões entre parênteses como o nome da função de uma só vez, na forma de:
Por exemplo:
Nota: Embora remover os parênteses
str_replace()
não seja um erro, colocar parênteses torna o código mais legível. No entanto, você não pode fazer isso algumas vezes, por exemplo, enquanto estiver usando.
operador. Para ser consistente, recomendo que você coloque os parênteses sempre.Chamada de método dinâmico: nome do método On-the-fly
Assim como as chamadas de função dinâmica, podemos fazer o mesmo com as chamadas de método, cercadas por chaves em vez de parênteses (para formas extras, navegue até a seção TL; DR):
Veja em um exemplo:
Chamada de método dinâmico: a sintaxe da matriz
Uma maneira mais elegante adicionada no PHP7 é a seguinte:
Como um exemplo:
Nota: O benefício de usar esse método em relação ao anterior é que você não se importa com o tipo de chamada (por exemplo, se é estático ou não).
Exemplo extra: usando classes anônimas
Para tornar as coisas um pouco complicadas, você pode usar uma combinação de classes anônimas e os recursos acima:
TL; DR (Conclusão)
Geralmente, no PHP7, é possível usar os seguintes formulários:
Baseado principalmente nesta conversa sobre PHP .
fonte
(expressions)->$bar()
Nomes de funções dinâmicas e espaços para nome
Apenas para adicionar um ponto sobre nomes de funções dinâmicas ao usar espaços para nome.
Se você estiver usando espaços para nome, o seguinte não funcionará, exceto se sua função estiver no espaço para nome global:
O que fazer?
Você precisa usar
call_user_func()
:fonte
Complementando a resposta de @Chris K se você quiser chamar o método de um objeto, você pode chamá-lo usando uma única variável com a ajuda de um fechamento:
Eu postei outro exemplo aqui
fonte
O que aprendi com esta pergunta e as respostas. Obrigado a todos!
Digamos que eu tenho essas variáveis e funções:
Para chamar função sem argumentos
Para chamar função com 1 argumento
Para chamar a função com 1 ou mais argumentos Isso será útil se você estiver chamando dinamicamente suas funções e cada função tiver um número diferente de argumentos. Este é o meu caso que eu tenho procurado (e resolvido).
call_user_func_array
É a chaveYay tchau!
fonte
Use a função call_user_func.
fonte
O código a seguir pode ajudar a escrever a função dinâmica no PHP. agora o nome da função pode ser alterado dinamicamente pela variável '$ current_page'.
fonte
$function
variável sem nenhum motivo.A maneira mais fácil de chamar uma função com segurança usando o nome armazenado em uma variável é,
Eu usei como abaixo para criar tabelas de migração dinamicamente no Laravel,
fonte
Uma abordagem não convencional, que me veio à mente, é menos que você esteja gerando todo o código por meio de uma IA super ultra autônoma que se escreve , há grandes chances de que as funções que você deseja "dinamicamente" chamar já estejam definidas no seu código base. Então, por que não apenas verificar a corda e fazer o infame
ifelse
dança para convocar o ... você entendeu o meu ponto.por exemplo.
Até
switch-case
pode ser usado se você não gostar do sabor suave daifelse
escada.Entendo que há casos em que a " chamada dinâmica da função " seria uma necessidade absoluta ( como uma lógica recursiva que se modifica ). Mas a maioria dos casos de uso triviais do dia a dia pode ser esquivada.
Ele elimina muita incerteza do seu aplicativo, enquanto oferece a chance de executar uma função de fallback se a string não corresponder a nenhuma das definições de funções disponíveis. NA MINHA HUMILDE OPINIÃO.
fonte
if (method_exists($functionName)) $functionName(); else //exception or handle
Eu não sei por que você tem que usar isso, não parece tão bom para mim, mas se houver apenas uma pequena quantidade de funções, você pode usar uma construção if / elseif. Não sei se é possível uma solução direta.
algo como $ foo = "bar"; $ test = "foo"; teste de eco $$;
deve retornar bar, você pode tentar, mas eu não acho que isso funcionará para funções
fonte