我正在使用Coldfusion MX 8.我最近遇到的情况是变量似乎在会话之间“交换”。我找到了有关整个会话交换的一些信息,但事实并非如此。它只是一个被交换的变量,而不是整个会话。我的代码片段如下:
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()
例如,在Log Spot#1中,idArray [i]可能是“1”,而StatusNotes事件arg可能是“abc”。
但是,另一个人,在另一个会话中,使用另一个登录,在另一个地方,另一个浏览器,等等。完全同时使用该函数,使用idArray [i] =“2”和statusNotes =“def”,然后项目详细信息“abc”可能会附加到项目“2”,项目详细信息“def”附加到项目“ 1” 。
事实上,在Log Spot#1,记录的变量是正确的,但在数据库中它们被交换,指向这些代码行作为嫌疑人。
通过在顶部声明“var oItem”,这个问题已经消失。
所以我想我对这个启示感到有些震惊。我认为不会声明我的局部变量将意味着另一个变量,具有相同的名称,在另一个函数中,但在同一个会话中可能会被覆盖。但这似乎是某种内部记忆问题。在会话之间甚至没有覆盖变量,而是交换变量!
我想知道是否有人有类似的经历,并且可以对此有所了解?
答案 0 :(得分:4)
Unvar'd变量在包含它们的对象中成为私有变量。这导致两个问题,
当你变量变量时,它只使它成为该函数的局部变量。只有那个功能可以使用它,它只能在该功能的存在下使用。
在您的情况下,此问题与会话实际上没有任何关系,除此之外是您正好存储来自这些函数的数据的持久范围。
你说
我认为不会在另一个函数中声明我的局部变量意味着另一个具有相同名称的变量,但在同一个会话中可能会被覆盖。
但是说
会更准确我认为不会在另一个函数中声明我的局部变量意味着另一个具有相同名称的变量,但是同一个OBJECT可能会被覆盖。