我有很多为 ColdFusion 8 编写的代码在 ColdFusion 10 中失败了。我意识到 CF9 和更高版本处理“本地”范围的方式与以前不同。我的问题是我已经编写了扩展每个函数的代码,因为子实例从父实例继承变量。但为了明确我的意思,让我举一个例子来说明在 CF10 中什么是有效的以及它是如何失败的。
以两个 CFC 为例,一个子 CFC 扩展了父 CFC:
<!--- Parent.cfc --->
<cfcomponent displayname="Parent">
<cffunction name="SomeFunction" output="yes">
<cfset local.parent_val = "Declared in parent instance">
</cffunction>
</cfcomponent>
<!--- Child.cfc --->
<cfcomponent displayname="Child" extends="Parent">
<cffunction name="SomeFunction" output="yes">
<cfset local.child_val = "Declared in child instance">
<!--- The following "super" call will instantiate the "parent_val" variable
from within the parent CFC's version of this function... but only in CF8? --->
<cfset Super.SomeFunction() />
<p>#local.child_val#</p>
<p>#local.parent_val#</p>
</cffunction>
</cfcomponent>
调用为:
<cfset ChildCFC = CreateObject("component","Child") />
<cfoutput>#ChildCFC.SomeFunction()#</cfoutput>
在 CF8 我得到:
Declared in child instanceDeclared in parent instance
在 CF10 中,我得到:
Declared in child instance[error dump showing "Element PARENT_VAL is undefined in LOCAL."]
如您所见,在 CF10 中,即使在调用函数的父版本(通过“super”)之后,在父版本中声明的局部变量也无法像在 CF8 下那样在子版本中访问。
所以,我的问题是:是否有希望恢复上述示例中设计的架构?如果没有,是否有我遗漏的简单迁移技巧?
我的很多代码都希望子函数能够通过使用 SUPER 调用来“查看”父函数中声明的变量(如上例所示)。对于那些面临从 CF8 到当前的过渡的人,我很感激你在这里的想法和建议。
最佳答案
在 Parent.cfc 中的 CF8 SomeFunction()
local.parent_val = blah // sets to variables.local.parent_val, dies with object
在 Parent.cfc 中的 CF9 SomeFunction()
local.parent_val = blah // eqv to var parent_val, dies right after function quits
您在 CF8 中的代码一开始就错了。如果它是函数本地的,它应该在函数的第一行有一个
var local = {}
。那么行为在 CF9+ 中不会改变。如果您现有的代码库没有遇到线程安全问题,那么我认为您可以将
local.
重命名为 variables.
以获取您希望与对象一起存在并稍后可由 child 访问的变量。关于coldfusion - CF8 与 CF10 : local scope declared in parent not visible in child functions,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25335713/