在我公司的代码中,我经常看到通过初始化该组件的对象并调用该对象的方法来使用组件文件。但是,在我看来,使用cfinvoke方法似乎更直接一些,特别是在只使用组件文件中的一个方法时。这两种调用组件函数的方法有什么区别,各自的优缺点是什么?我应该在什么时候使用哪一个?
发布于 2011-01-06 00:00:51
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>
--
另一件需要注意的事情是,一些共享主机锁定了createobject。主要是因为它提供了对下划线Java的访问。
发布于 2011-01-06 00:38:39
使用createObject()的另一个好处是您可以链接init()方法,例如
<cfset myObject = createObject("com.path.MyObject").init() />如果您的init()返回this,如果您不需要再次使用该对象,则可以进一步链接该方法:
<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />值得指出的是,在CF9中,您可以使用新的(嗯) new语法来创建对象。例如,要创建与上面相同的对象并将其命名为init(),我可以这样写:
<cfset myObject = new com.path.MyObject() />它很整洁,而且我喜欢这样做的选项。CF在我看来,像这样的功能正在朝着正确的方向发展。
发布于 2011-01-05 23:54:19
您自己几乎已经回答了这个问题:从表面上看,有人可能会说,如果您只在页面上调用一个方法,那么在CFINVOKE中一举完成(它实例化CFC并调用名为method的方法)是有意义的。当然,如果您要在页面上调用CFC的多个方法,那么分隔这些步骤是有意义的(使用createobject函数或cfobject标记实例化CFC,然后调用在该对象中找到的方法,指向CFC的指针),这样您就不需要多次支付实例化成本。
但是一定要记住,如果页面经常被调用,那么保存实例化CFC的结果也是有意义的,这样它就可以在对页面的后续请求中重用。为此,您可以将其(cfobject/createobject的结果)不存储在本地变量中,而是存储在一个共享作用域中:无论是服务器、应用程序还是会话,基于“谁”将从这种重用中受益。当然,您有责任以编程方式处理/决定将这个“缓存”的CFC实例保存多长时间。
同样重要的是,当您以这种方式保存一个CFC实例时,您更容易受到"var scope bug“的影响,这基本上是您需要更加小心地对您在CFC中创建的任何局部变量进行VAR。我将指出我在此创建的一个元资源,而不是试图详细说明这一点:
http://www.carehart.org/blog/client/index.cfm/2010/3/4/resources_on_the_var_scope_problem
希望这能有所帮助。
https://stackoverflow.com/questions/4605746
复制相似问题