Come chiamare dinamicamente una funzione che fa parte di un cfc istanziato, senza utilizzare Evaluate()?

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

  •  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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top