簡體   English   中英

使用cfinvoke和createObject來運行組件函數有什么區別?

[英]What is the difference between using cfinvoke and createObject to run a component function?

在我公司的代碼中,我經常看到初始化該組件的對象並從該對象調用方法時使用的組件文件。 但是,在我看來使用cfinvoke方法更為直接,特別是當只使用組件文件中的一個方法時。 調用組件函數的這兩種方法之間有什么區別?每種方法的優點/缺點是什么? 我什么時候應該使用哪個?

使用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正朝着正確的方向發展。

你自己幾乎已經回答了這個問題:從表面上看,可以說如果你只在一個頁面上調用一個方法,那么在CFINVOKE(實例化CFC並調用一個命名方法)中一舉完成就有意義了。 當然,如果你在頁面上調用CFC的多個方法,那么分離步驟是有意義的(使用createobject函數或cfobject標簽實例化CFC,然后調用在該對象中找到的方法,指向CFC的指針) ,這樣您就不會多次支付該實例化費用。

但請記住,如果經常調用頁面,那么保存實例化CFC的結果也是有意義的,這樣它就可以在對頁面的后續請求中重用。 您可以將它(cfobject / createobject的結果)存儲在本地變量中,而不是存儲在共享范圍內:服務器,應用程序或會話,基於“誰”將從此類重用中受益。 當然,您有責任以編程方式處理/決定保存此“緩存”CFC實例的時間。

同樣重要的是,當您以這種方式保存CFC實例時,您會更容易受到“變量范圍錯誤”的影響,這基本上是您需要更加小心VAR在CFC中創建的任何局部變量。 我會指出一個我創建的元資源,而不是試圖詳細闡述它:

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

希望有所幫助。

而不是重新討論這個討論,我只會指向Google:

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

有一些細微的差別(IE: <cfinvoke>能夠處理動態方法名稱),但實際上它只是歸結為個人偏好。 好了,而事實上,你不能使用<cfinvoke>通過<cfscript>

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提供了訪問權限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM