Como chamar uma função dinamicamente que é parte de um cfc instanciado, sem usar Avaliar ()?

StackOverflow https://stackoverflow.com/questions/84463

  •  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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top