7

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

application.obj[funcName](argumentCollection=params)

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

谢谢

4

4 回答 4

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#" 调用它来动态调用特定函数。

于 2008-09-17T16:03:10.133 回答
4

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

<cfinvoke method="application.#funcName#" argumentCollection="#params#">
于 2008-09-17T16:03:37.513 回答
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>
于 2011-10-18T03:42:55.370 回答
1

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

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

函数的上下文很重要,尤其是当它引用对象的“变量”或“this”范围内的任何值时。注意:对于共享范围内的 CFC 实例,这不是线程安全的!

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

于 2011-10-18T10:41:04.237 回答