Comment appeler une fonction dynamique qui fait partie d'une cfc instanciée, sans utiliser Evaluate ()?

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

  •  01-07-2019
  •  | 
  •  

Question

Par exemple, je souhaite pouvoir programmer par programme une ligne de code comme celle ci-dessous, dans laquelle le nom de la fonction est attribué de manière dynamique sans utiliser Evaluate (). Bien entendu, le code ci-dessous ne fonctionne pas, mais représente ce que j'aimerais faire.

application.obj[funcName](argumentCollection=params)

Le seul moyen que je puisse trouver pour appeler une fonction de façon dynamique consiste à utiliser cfinvoke, mais pour autant que je sache, cela instancie la fonction / cfc correspondante à la volée et ne peut pas utiliser une cfc précédemment instanciée.

Merci

Était-ce utile?

La solution

Selon la documentation, vous pouvez faire quelque chose comme ceci:

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

Vous devriez pouvoir l'appeler simplement avec method = "# myMethod # " d'appeler dynamiquement une fonction particulière.

Autres conseils

Vous pouvez utiliser cfinvoke. Vous n'êtes pas obligé de spécifier un composant.

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

Vous pouvez également faire quelque chose de très similaire, à la manière dont vous voulez l’utiliser. Vous pouvez accéder à la méthode dans l'objet en utilisant la syntaxe que vous avez utilisée, vous ne pouvez simplement pas l'appeler en même temps. Cependant, si vous l'assignez à une variable temporaire, vous pouvez l'appeler

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

Dans CFML, les fonctions sont des membres de première classe du langage. Cela nous permet de les faire passer comme une variable. Dans l'exemple suivant, je vais copier la fonction nommée 'foobar' et la renommer "$ fn". dans le même objet. Ensuite, nous pouvons simplement appeler $ fn ().

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

Le contexte de la fonction est important, en particulier si elle référence des valeurs dans la portée "variables" ou "ceci" de l'objet. Remarque: ceci n'est pas thread-safe pour les instances CFC dans des portées partagées!

La méthode la plus rapide consiste à utiliser la recommandation de Ben Doom. Je voulais juste être approfondi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top