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

时间:2011-01-05 15:23:00

标签: coldfusion components design-decisions createobject cfinvoke

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

4 个答案:

答案 0 :(得分:8)

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

<cfset myObject = createObject("com.path.MyObject").init() />

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

<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />

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

<cfset myObject = new com.path.MyObject() />

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

答案 1 :(得分:4)

你自己几乎已经回答了这个问题:从表面上看,可以说如果你只在一个页面上调用一个方法,那么就在CFINVOKE中实例化一下(它实例化CFC并调用一个命名方法) ) 合理。当然,如果你在页面上调用CFC的多个方法,那么分离步骤是有意义的(使用createobject函数或cfobject标签实例化CFC,然后调用在该对象中找到的方法,指向CFC的指针) ,这样您就不会多次支付该实例化费用。

但请记住,如果经常调用页面,那么保存实例化CFC的结果也是有意义的,这样它就可以在对页面的后续请求中重用。您可以将它(cfobject / createobject的结果)存储在本地变量中,而不是存储在共享范围内:服务器,应用程序或会话,基于“谁”将从此类重用中受益。当然,您有责任以编程方式处理/决定保存此“缓存”CFC实例的时间。

同样重要的是,当您以这种方式保存CFC实例时,您会更容易受到“var scope bug”的影响,这主要是您需要更加小心VAR在CFC中创建的任何局部变量。我不是试图详细说明,而是指出我在其上创建的元资源:

http://www.carehart.org/blog/client/index.cfm/2010/3/4/resources_on_the_var_scope_problem

希望有所帮助。

答案 2 :(得分:4)

而不是重新讨论这个讨论,我只会指向Google:

http://www.google.com/search?q=cfinvoke+vs+createobject

存在一些微妙的差异(IE:<cfinvoke>能够处理动态方法名称)但实际上它只是归结为个人偏好。好吧,那就是你无法通过<cfinvoke>使用<cfscript>

答案 3 :(得分:4)

cfinvoke只能在标签中使用。

createObject可用于两个标签和cfscript并且往往有点苗条/更容易阅读IMO。

直到最近我才避免使用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>

-

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