我有很多为 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/

10-11 07:48