如何在不使用Evaluate()的情况下动态调用属于实例化cfc的函数?

时间:2008-09-17 15:26:18

标签: coldfusion cfc

例如,我希望能够以编程方式命中一行代码,如下所示,在不使用Evaluate()的情况下动态分配函数名称。下面的代码当然不起作用,但代表了我想做的事情。

application.obj[funcName](argumentCollection=params)

我能找到动态调用函数的唯一方法是使用cfinvoke,但据我所知,它实时实例化相关的cfc /函数,不能使用以前实例化的cfc。

由于

4 个答案:

答案 0 :(得分:9)

根据文档,您可以这样做:

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

您应该可以使用method =“#myMethod#”简单地调用它来动态调用特定函数。

答案 1 :(得分:4)

您可以使用cfinvoke。您不必指定组件。

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

答案 2 :(得分:1)

你也可以按照你想要的方式做一些非常相似的事情。您可以使用您使用的语法访问对象内的方法,但您无法同时调用它。但是,如果将其分配给临时变量,则可以将其调用

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

答案 3 :(得分:1)

在CFML中,函数是该语言的一流成员。这允许我们像变量一样传递它们。在下面的例子中,我将复制名为'foobar'的函数,并在同一对象中将其重命名为“$ fn”。然后,我们可以简单地调用$ fn()。

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

函数的上下文很重要,特别是如果它引用对象的'variables'或'this'范围中的任何值。注意:对于共享作用域中的CFC实例,这不是线程安全的!

最快的方法是使用Ben Doom的推荐。我只想彻底。