请考虑以下代码:
<cfset local.quiz = getQuiz(param1,param2) />
<!--- returns a struct that has a key called unlock_at --->
<cfset quiz.unlock_at = (quiz.unlock_at EQ '') ? '' : DateConvert('utc2Local',createODBCDateTime(ISOToDateTime(quiz.unlock_at))) />
这是我原创编写代码的方式。当我多次调用运行此代码的页面时,quiz.unlock_at
的值以6小时为增量(函数中的调整量)发生变化。当我说增量我的意思是第一页加载时间是说12:00。下一页加载6:00,下一页加载00:00,依此类推。每次物理时间都在变化。我将代码更改为:
<cfset local.unlock_at = (quiz.unlock_at EQ '') ? '' : DateConvert('utc2Local',createODBCDateTime(ISOToDateTime('#quiz.unlock_at#'))) />
首先,我将值存储在局部变量中,不再更新现有的struct。第二件事是我将日期作为字符串传递给函数而不是变量。我不确定它是如何被改变的。在任何一种情况下:
请求之间如何变化。我并不认为这些变量存在于页面请求之间。所有这些代码都在一个存在于CFC中的函数内。这些数据中的任何内容都是持久的。我打了几次电话,看了日期变化然后打开了一个新的浏览器,数据也被改变了。怎么可能?
这是一个范围问题,组件的数据持久性问题?告诉我一个循环,我仍然不确定发生了什么,直到我这样做,我担心我可能还有其他问题。
答案 0 :(得分:1)
我明白了。哎呀...
函数getQuiz
创建了一个结构,然后缓存它。原因是它是一个API调用,我不希望每次都为不经常改变的数据运行API调用。所以我在做的是:
<cffunction name="getQuiz">
<cfset local.variable = {} />
<!--- Load Sturct Data --->
<!--- CachePut the variable --->
<cfreturn variable />
</cffunction>
<cfset quiz = getQuiz() />
<cfset quiz.unlock_at = 1 />
<!--- At this point I have actually edited a direct reference to the cached variable quiz even though I tried locally scoping it etc.
因此,显然返回结构与将结构传递给函数是一样的,即它通过引用而不是通过值传递结构。出于某种原因,我认为返回一个结构并没有将它作为引用返回,但它是有道理的,因为这是CF在函数之间传递值的方式。