【问题标题】:How does Coldfusion deal with createObject internally?Coldfusion内部如何处理createObject?
【发布时间】:2014-03-31 07:07:21
【问题描述】:

假设我想从 cfscript 块中的 CFC 调用静态函数。据我所知,唯一的方法是使用 createObject() 返回对 CFC 对象的引用。

这是好的做法吗?我想我记得读过 cfinvoke 肯定会巧妙地实例化对象,并且不会多次实例化静态 CFC。这甚至是真的吗,如果是的话,在使用 createObject() 时这仍然是真的吗?

【问题讨论】:

  • 这是好的做法吗?是的。
  • CF 本身并没有真正的静态,但正如@iKnowKungFoo 的回应所解释的那样,最终行为归结为如何你编码它。

标签: coldfusion coldfusion-7


【解决方案1】:

CFOBJECT

CFOBJECT 实例化一个组件并为其创建一个变量。

<cfobject type="component" name="path.to.my.CFC" name="myCFC" />

CFINVOKE

CFINVOKE 然后可以引用由 CFOBJECT 创建的变量,因此它不必再次重新创建对象。

<cfinvoke component="#myCFC#" method="foo" returnVariable="myValue" />

因此,您可以在 #myCFC# 上调用任意数量的 CFINVOKE,而无需重新创建对象。

但是,如果您不使用 CFOBJECT,CFINVOKE 也可以为您隐式创建对象。

<cfinvoke component="path.to.my.CFC" method="foo" returnVariable="myValue" />

以这种方式调用多个函数每次都会重新创建对象。

创建对象

createObject() 的工作方式几乎相同。要么先用引用变量创建对象

<cfscript>
myCFC = createObject("component", "path.to.my.CFC");
myValue = myCFC.foo();
otherValue = myCFC.bar();
</cfscript>

或在每个函数调用中创建对象。

<cfscript>
myValue = createObject("component", "path.to.my.CFC").foo();
otherValue = createObject("component", "path.to.my.CFC").bar();
</cfscript>

我更喜欢createObject(),因为我一直在尽可能多地使用 CFSCRIPT。如果我要从中调用多个函数,我总是先创建对象。

【讨论】:

  • 你也可以使用 invoke(cfc, methodname [, arguments]) ,它接受一个 cfc 实例或组件名称。
  • 所以我认为如果我想将组件用作静态函数的类,我必须小心只使用一次 createObject 并将结果实例保存在内存中,例如应用范围?
  • @leokhorn 这是最佳实践。如果您需要 CFC 的内容可用于整个应用程序,请使用 APPLICATION 范围。如果您有多个实例,您可能会查看 SERVER 范围,以便所有实例都可以使用相同的代码并减少内存。如果您需要一个对象在用户登录会话的整个生命周期内都存在,请将其放在 SESSION 范围内。请注意内存使用情况,不要过度使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多