¿Cómo llamar dinámicamente a una función que forma parte de un cfc instanciado, sin utilizar Evaluate()?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Por ejemplo, quiero poder acceder mediante programación a una línea de código como la siguiente donde el nombre de la función se asigna dinámicamente sin usar Evaluate().El siguiente código, por supuesto, no funciona, pero representa lo que me gustaría hacer.

application.obj[funcName](argumentCollection=params)

La única forma que puedo encontrar para llamar a una función dinámicamente es mediante el uso de cfinvoke, pero hasta donde sé, eso crea una instancia del cfc/función relacionada sobre la marcha y no puede usar un cfc creado previamente.

Gracias

¿Fue útil?

Solución

Según los documentos, puedes hacer algo como esto:

<!--- 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">

Debería poder simplemente llamarlo con método="#myMethod#" para llamar dinámicamente a una función particular.

Otros consejos

Puedes usar cfinvoke.No es necesario especificar un componente.

<cfinvoke method="application.#funcName#" argumentCollection="#params#">

También puedes hacer algo muy similar a la forma en que querías usarlo.Puedes acceder al método dentro del objeto usando la sintaxis que usaste, pero no puedes llamarlo al mismo tiempo.Sin embargo, si lo asigna a una variable temporal, puede llamarlo

<!--- 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>

En CFML, las funciones son miembros de primera clase del lenguaje.Esto nos permite pasarlos como una variable.En el siguiente ejemplo, copiaré la función denominada 'foobar' y le cambiaré el nombre a "$fn" dentro del mismo objeto.Entonces, simplemente podemos llamar a $fn().

funcName = 'foobar';    
application.obj.$fn = application.obj[funcName];
application.obj.$fn(argumentCollection=arguments);

El contexto de la función es importante, especialmente si hace referencia a algún valor en las 'variables' o 'este' alcance del objeto.Nota:¡Esto no es seguro para subprocesos para instancias CFC en ámbitos compartidos!

El método más rápido es utilizar la recomendación de Ben Doom.Sólo quería ser minucioso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top