Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session Coldfusion变量不使用“var”声明有多全局?_Session_Variables_Coldfusion - Fatal编程技术网

Session Coldfusion变量不使用“var”声明有多全局?

Session Coldfusion变量不使用“var”声明有多全局?,session,variables,coldfusion,Session,Variables,Coldfusion,我正在使用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.

我正在使用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()
例如,在日志点1,idArray[i]可能是“1”,而StatusNotes事件arg可能是“abc”

但是,如果另一个人在另一个会话中,使用另一个登录名,在另一个地方,使用另一个浏览器,等等。同时使用该函数,使用idArray[i]=“2”和statusNotes=“def”,则项目详细信息“abc”可能会附加到项目“2”,项目详细信息“def”可能会附加到项目“1”

在日志点1,记录的变量是正确的,但在数据库中它们被交换,这表明这些代码行是可疑的

通过在顶部声明“var oItem”,这个问题已经解决了

所以我想我对这个发现感到有点震惊。我假设不声明局部变量意味着在另一个函数中使用另一个同名变量,但在同一个会话中可能会被覆盖。但这似乎是某种内存问题。这些变量甚至没有被覆盖,而是在会话之间交换


我想知道是否有人有过类似的经历,并能对此有所启发?

unvard变量在包含它们的对象中被设置为私有变量。导致两个问题,

它们由同一组件中的函数共享、访问和写入 它们超出了函数调用的生命周期 当你对一个变量进行var时,它会使它成为一个局部变量,仅适用于该函数。只有那个函数才能使用它,而且它的寿命只有那个函数的寿命长

在您的例子中,这个问题实际上与会话没有任何关系,只是在持久作用域中,您碰巧存储了来自这些函数的数据

你说

我假设不声明局部变量意味着在另一个函数中使用另一个同名变量,但在同一个会话中可能会被覆盖

但更准确的说法是

我假设不声明我的局部变量意味着另一个函数中的另一个具有相同名称的变量,但是同一个对象中的变量可能会被覆盖


Unvar变量在包含它们的对象内成为私有变量。导致两个问题,

它们由同一组件中的函数共享、访问和写入 它们超出了函数调用的生命周期 当你对一个变量进行var时,它会使它成为一个局部变量,仅适用于该函数。只有那个函数才能使用它,而且它的寿命只有那个函数的寿命长

在您的例子中,这个问题实际上与会话没有任何关系,只是在持久作用域中,您碰巧存储了来自这些函数的数据

你说

我假设不声明局部变量意味着在另一个函数中使用另一个同名变量,但在同一个会话中可能会被覆盖

但更准确的说法是

我假设不声明我的局部变量意味着另一个函数中的另一个具有相同名称的变量,但是同一个对象中的变量可能会被覆盖


你的回答很有帮助,谢谢。这是因为cfc是由所有会话共享的,并且变量作为一个整体被设置为cfc的局部变量,而不是单个函数调用。我仍然有点困惑,为什么变量会真正交换。如果它们只是被覆盖,我会理解,但这两个变量都保持不变,并且都被另一个会话引用。但现在我了解了共享内存问题发生的位置,这只是一个小细节。只有在持久范围内共享CFC,并且该持久范围由所有会话(如应用程序或服务器)共享时,CFC才能由所有会话共享。很可能是您创建了所谓的竞争条件。您让两个用户同时命中一个共享对象,并且由于对象范围的变量,您得到了彼此的数据,而不是他们自己的数据。您的回答很有帮助,谢谢。这是因为cfc是由所有会话共享的,并且变量作为一个整体被设置为cfc的局部变量,而不是单个函数调用。我仍然有点困惑,为什么变量会真正交换。如果它们只是被覆盖,我会理解,但这两个变量都保持不变,并且都被另一个会话引用。但现在我了解了共享内存问题发生的地方,这只是一个小细节。只有在所有会话共享的持久作用域中共享CFC,才能由所有会话共享 像应用程序或服务器这样的会话。很可能是您创建了所谓的竞争条件。您让两个用户同时命中一个共享对象,并且由于对象范围的变量,他们取回了彼此的数据,而不是他们自己的数据。