6

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

4

4 回答 4

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 正朝着正确的方向发展,具有这样的功能。

于 2011-01-05T16:38:38.673 回答
4

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

但是请记住,如果页面经常被调用,那么保存实例化 CFC 的结果也可能有意义,以便可以在对页面的后续请求中重用它。您可以通过将它(cfobject/createobject 的结果)存储在一个共享范围而不是本地变量中来做到这一点:无论是服务器、应用程序还是会话,基于“谁”将从这种重用中受益。当然,您有责任以编程方式处理/决定保存这个“缓存的”CFC 实例多长时间。

同样重要的是,当您以这种方式保存 CFC 实例时,您变得更容易受到“var 范围错误”的影响,这基本上是您需要更加小心地对您在 CFC 中创建的任何局部变量进行 VAR。与其试图详细说明这一点,我将指出我在此基础上创建的元资源:

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

希望有帮助。

于 2011-01-05T15:54:19.140 回答
4

而不是重新讨论这个讨论,我只是将你指向谷歌:

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

有一些细微的差异(IE:<cfinvoke>能够处理动态方法名称),但本质上它只是归结为个人喜好。好吧,那以及您不能使用<cfinvoke>via的事实<cfscript>

于 2011-01-05T15:54:23.813 回答
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。

于 2011-01-05T16:00:50.650 回答