2012-04-02 38 views
1

我使用的ColdFusion MX 8.我最近有一個情況似乎變量會話之間進行「交換」。我發現有關整個會話交換的一些信息,但事實並非如此。它只是一個被交換的變量,而不是整個會話。我的代碼片段如下:Coldfusion變量不是用「var」聲明的,全球性如何?

var idArray = ListToArray(arguments.event.getArg("itemIDs")); 
var oItemDetail = 0; 
var oItem = 0; //Inserting this line seems to have fixed the error. 
var i = 0; 

for (i=1;i lte ArrayLen(idArray);i=i+1) { 

    //Log Spot #1 – cflog idArray[i] and arguments.event.getArg("statusNotes") 

    oItem = getItemService().getItem(idArray[i]); 
    oItemDetail = getItemService().getItemDetail(); 
    oItemDetail.setItemID(oItem.getItemID()); 

    oItemDetail.setStatusNotes(arguments.event.getArg("statusNotes")); 

    getItemService().saveItem(oItem); 
    getItemService().saveItemDetail(oItemDetail); 
} 

//getItem and getItemDetail just call getTransfer().get() 
//saveItem and saveItemDetail just call getTransfer().save() 

例如,在登錄現貨#1,idArray [I]可能是「1」,和狀態注事件ARG可能是「ABC」。

但是,如果另一個人在另一個會話中使用另一個登錄名,在另一個地方,另一個瀏覽器等等。使用此功能在完全相同的時間,使用idArray [I] =「2」和狀態注=「高清」,那麼項目詳細信息「ABC」的可能,而不是重視項目「2」和項目詳細信息「高清」附加項「 1」 。

事實上,在日誌點#1中,記錄的變量是正確的,但在數據庫中它們被交換時,指向這些代碼行作爲嫌疑犯。

通過在頂部聲明「var oItem」,此問題已消失。

所以我想我對這個啓示有點震驚。我會認爲沒有宣佈我的本地變量將意味着另一個變量,使用相同的名稱,在另一個功能,但在相同的會話可能會被覆蓋。但這似乎是某種內部記憶問題。變量甚至不會被覆蓋,而是在會話之間交換!

我想知道是否有人有類似的經歷,並可以對此有所瞭解?

回答

4

Unvar'd變量。這會導致兩個問題,它們都包含在物體內進行私有變量,

  1. 它們將共享(訪問和寫入)的功能(即同一組件內)
  2. 他們住超越函數調用

的生命當你VAR它使一個局部變量只對函數的變量。只有那個函數可以使用它,它只能在該函數中一直存在。

在你的情況下,這個問題並沒有真正與會話有關,除了你正在存儲來自這些函數的數據的持久範圍之外。

你說

我會假設,不能說出我的局部變量將意味着另一個變量,使用相同的名稱,在另一個功能,但在相同的會話可能會被覆蓋。

但是這將是更準確的說

我會假設,不能說出我的局部變量將意味着另一個變量,使用相同的名稱,在另一個功能,但在同一個對象可能得到覆蓋。

+0

您的回答很有幫助,謝謝。所以,這是因爲CFC由所有會話共享,而且變量是局部在CFC作爲一個整體,而不是單獨的函數調用。 爲什麼變量會實際交換,我還是有點困惑。我會理解它們是否被簡單地覆蓋,但是這兩個變量都保持不變,並且每個會話都被引用。 但現在我知道共享內存問題發生在哪裏,這是一個小細節。 – 2012-04-02 03:05:37

+2

只有在所有會話共享的持久範圍內(如應用程序或服務器)共享CFC,才能共享所有會話使用的CFC。很可能你創造了所謂的「競爭條件」。你有兩個用戶同時擊中共享對象,並且由於對象作用域變量取回了彼此的數據而不是自己的數據。 – 2012-04-02 12:50:58