【问题标题】:What is the difference between using cfinvoke and createObject to run a component function?使用 cfinvoke 和 createObject 运行组件函数有什么区别?
【发布时间】:2011-01-05 15:22:59
【问题描述】:

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

【问题讨论】:

    标签: coldfusion components design-decisions createobject cfinvoke


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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。

      【讨论】:

      • -1 表示“但它的优点是你可以动态循环 CFC 中的方法。在 createobject 中你不能。” for (var k in o) { if (isCustomFunction(o[k])) { o[k](argumentCollection = 不管);这将在 Railo 中逐字执行。对于 Adob​​e CF 7-9,您需要这样做: var k = ''; for (k in o) { var m = o[k]; if (isCustomFunction(m)) { m(argumentCollection = 不管); } }
      【解决方案3】:

      您自己几乎已经回答了这个问题:从表面上看,如果您将在页面上仅调用一个方法,那么在 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

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

        与其重新讨论这个讨论,我只会将您指向 Google:

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

        有一些细微的差别(即:&lt;cfinvoke&gt; 能够处理动态方法名称)但基本上归结为个人喜好。好吧,那以及你不能使用&lt;cfinvoke&gt;via &lt;cfscript&gt;这一事实。

        【讨论】:

        • 这里没有理由使用短网址。更新为仅指向最终目的地。 ;)
        • 我直接从谷歌复制了所有其他无关紧要的废话,所以我只是点击了“用 bit.ly 缩短”小书签以使其更干净。感谢更新。
        猜你喜欢
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多