2011-02-23 33 views
1

我想知道一個cfc是如何在coldfusion下實例化的!我知道你創建了一個組件的實例,你會得到一個對新創建的實例的引用,你可以用它來調用它們中的公共方法。ColdFusion CFC實例創建的生命週期是什麼?

但是,當我寫個代碼

<cfscript> 
person = createObject('component','human') // what happen here!!!! 
person.speak(); 
</cfscript> 

提出了一些修正,我在這裏的講話!究竟發生了什麼。爲什麼我問這個問題的原因是因爲我有存儲在應用範圍實例,該實例是非常高負載下使用如下

application.person.speak(); 

現在。我發現內存不是爲obj發佈的,並且在某些時候達到了200mb ..奇怪! 。如此作出的修正,因爲它說,在最佳實踐

request.person = duplicate(application.person); 

現在還有另一種直接的方式做,這是

request.person = createObject('component','human'); 

區別,第一個創建對象並保持它在份額範圍內,做一個深層副本,每次請求時都會請求(這裏只創建一次實例)。其次,每次請求都會創建實例。它們之間存在性能差異,因爲在第二種方法中,每次都創建實例。我想知道創建一個實例後面的架構究竟是什麼,使前者變得更好!

只想知道!

回答

0

從我的理解,它運行的是CFC裏面的init方法/函數,然後運行該講方法/函數。

0

發生了什麼?沒什麼特別的。

對於CFC,init()只是一個用於初始化實例的方法。如果您不需要構造函數,甚至不需要CFC。然而,它往往是由社會通過約定包括,源於ColdFusion的選擇使用init()用於調用Java的構造。*

function init() 
{ 
    // init vars in Variable scope if needed... 

    return this; 
} 

在CF9,當您使用new運營商,它會調用init()爲你如果可用,並且如果您的CFC沒有定義方法init(),它不會拋出任何錯誤。

*當調用Java方法時,init()被轉換爲調用Java類的正確構造函數。如果您只想調用該類的靜態方法,請直接調用該方法,而不使用init()

相關問題