Come chiamare dinamicamente una funzione che fa parte di un cfc istanziato, senza utilizzare Evaluate()?
-
01-07-2019 - |
Domanda
Ad esempio, voglio essere in grado di raggiungere in modo programmatico una riga di codice come la seguente in cui il nome della funzione viene assegnato dinamicamente senza utilizzare Evaluate().Il codice seguente ovviamente non funziona ma rappresenta ciò che vorrei fare.
application.obj[funcName](argumentCollection=params)
L'unico modo che riesco a trovare per chiamare una funzione in modo dinamico è utilizzare cfinvoke, ma per quanto ne so, istanzia al volo la relativa cfc/funzione e non può utilizzare un cfc precedentemente istanziato.
Grazie
Soluzione
Secondo i documenti, puoi fare qualcosa del genere:
<!--- 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">
Dovresti essere in grado di chiamarlo semplicemente con metodo="#myMethod#" per chiamare dinamicamente una particolare funzione.
Altri suggerimenti
Puoi usare cfinvoke.Non è necessario specificare un componente.
<cfinvoke method="application.#funcName#" argumentCollection="#params#">
Puoi anche fare qualcosa di molto simile, nel modo in cui volevi usarlo.Puoi accedere al metodo all'interno dell'oggetto usando la sintassi che hai usato, semplicemente non puoi chiamarlo allo stesso tempo.Tuttavia, se lo assegni a una variabile temporanea, puoi chiamarlo
<!--- 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>
In CFML, le funzioni sono membri di prima classe del linguaggio.Questo ci consente di trasmetterli come una variabile.Nell'esempio seguente copierò la funzione denominata 'foobar' e la rinominerò "$fn" all'interno dello stesso oggetto.Quindi, possiamo semplicemente chiamare $fn().
funcName = 'foobar';
application.obj.$fn = application.obj[funcName];
application.obj.$fn(argumentCollection=arguments);
Il contesto della funzione è importante, soprattutto se fa riferimento a qualsiasi valore nelle "variabili" o nell'ambito "questo" dell'oggetto.Nota:questo non è thread-safe per le istanze CFC negli ambiti condivisi!
Il metodo più veloce è utilizzare la raccomandazione di Ben Doom.Volevo solo essere approfondito.