使用cfinvoke和createObject来运行组件函数有什么区别?

fro*_*die 6 coldfusion components createobject design-decisions cfinvoke

在我公司的代码中,我经常看到初始化该组件的对象并从该对象调用方法时使用的组件文件.但是,在我看来使用cfinvoke方法更为直接,特别是当只使用组件文件中的一个方法时.调用组件函数的这两种方法之间有什么区别?每种方法的优点/缺点是什么?我什么时候应该使用哪个?

Cia*_*her 8

使用的另一个好处createObject()是您可以链接该init()方法,例如

<cfset myObject = createObject("com.path.MyObject").init() />
Run Code Online (Sandbox Code Playgroud)

如果您不需要再次使用该对象,那么如果您的init()返回this可以更进一步并链接该方法:

<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />
Run Code Online (Sandbox Code Playgroud)

值得指出的是,在CF 9中,您可以使用新的(ahem)new语法来创建对象.例如,要创建与上面相同的对象并调用它,init()我可以写:

<cfset myObject = new com.path.MyObject() />
Run Code Online (Sandbox Code Playgroud)

它很整洁,我喜欢这样做的选择.在我看来,CF正朝着正确的方向发展.


Jam*_*ham 4

cfinvoke 只能在标签中使用。

createObject 可以在标签和 cfscript 中使用,并且在我看来更精简/更易于阅读。

直到最近,我还避免使用 cfinvoke,因为我发现它“笨重”,但它的优点是您可以动态循环 CFC 中的方法。在 createobject 中你不能。

例如,如果我有一个 CFC,它具有方法 - method1、method2、method3、method4。我可以像这样循环它们:-

<cfloop from="1" to="4" index="element">
   <cfif structKeyExists(this,'getMethod#element#')>
<cfinvoke component="#this#" method="getLine#local.element#" returnVariable="methodValue"></cfinvoke>
<cfset arrayAppend(myArray,methodValue) />
   </cfif>
Run Code Online (Sandbox Code Playgroud)

--

另一件需要注意的事情是,某些共享主机会锁定 createobject。主要是因为它提供了对下面的 Java 的访问。