Como chamar uma função dinamicamente que é parte de um cfc instanciado, sem usar Avaliar ()?
-
01-07-2019 - |
Pergunta
Por exemplo, eu quero ser capaz de programaticamente atingiu uma linha de código como o seguinte, onde o nome da função é atribuído dinamicamente sem usar Avaliar (). O código abaixo é claro que não funciona, mas representa o que eu gostaria de fazer.
application.obj[funcName](argumentCollection=params)
A única maneira que eu posso encontrar para chamar uma função é dinamicamente usando cfinvoke, mas tanto quanto eu posso dizer que instancia o cfc / função relacionada na mosca e não pode usar um cfc anteriormente instanciado.
Graças
Solução
De acordo com os documentos, você pode fazer algo como isto:
<!--- Create the component instance. --->
<cfobject component="tellTime2" name="tellTimeObj">
<!--- Invoke the methods. --->
<cfinvoke component="#tellTimeObj#" method="getLocalTime" returnvariable="localTime">
<cfinvoke component="#tellTimeObj#" method="getUTCTime" returnvariable="UTCTime">
Você deve ser capaz de chamá-lo simplesmente com o método = "# myMethod #" para chamar dinamicamente uma função particular.
Outras dicas
Você pode usar cfinvoke. Você não precisa especificar um componente.
<cfinvoke method="application.#funcName#" argumentCollection="#params#">
Você também pode fazer algo muito semelhante, à maneira que você queria usá-lo. Você pode acessar o método dentro do objeto usando a sintaxe que você usou, você simplesmente não pode chamá-lo ao mesmo tempo. No entanto, se você atribuir a uma variável temp, então você pode chamá-lo
<!--- get the component (has methods 'sayHi' and a method 'sayHello') --->
<cfset myObj = createObject("component", "test_object")>
<!--- set the function that we want dynamically then call it (it's a two step process) --->
<cfset func = "sayHi">
<cfset funcInstance = myObj[func]>
<cfoutput>#funcInstance("Dave")#</cfoutput>
<cfset func = "sayHello">
<cfset funcInstance = myObj[func]>
<cfoutput>#funcInstance("Dave")#</cfoutput>
Em CFML, as funções são membros de primeira classe da língua. Isso nos permite passá-los em torno de como uma variável. No exemplo a seguir vou copiar a função chamado 'foobar' e renomeá-lo "$ fn" dentro do mesmo objeto. Então, podemos simplesmente chamar $ fn ().
funcName = 'foobar';
application.obj.$fn = application.obj[funcName];
application.obj.$fn(argumentCollection=arguments);
O contexto da função é importante, especialmente se ele faz referência quaisquer valores nas 'variáveis' ou 'esta' escopo do objeto. Nota: este não é o segmento seguro para casos de CFC em escopos compartilhados
O método mais rápido é usar a recomendação de Ben Perdição. Eu só queria ser completo.