CF8与CF10:在父函数中声明的局部范围在子函数中不可见

时间:2014-08-15 23:56:19

标签: coldfusion coldfusion-9 coldfusion-10

我在ColdFusion 10中为ColdFusion 8编写了相当多的代码。我意识到CF9和更高版本处理“Local”范围与以前不同。我的问题是我编写了扩展每个函数的函数,因为子实例从父类继承变量。但是为了清楚地说明我的意思,让我举一个例子说明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 instance Declared in parent instance

在CF10中,我得到: Declared in child instance [error dump showing "Element PARENT_VAL is undefined in LOCAL."]

正如您所看到的,在CF10中,即使在调用函数的父版本(通过“super”)之后,在父级中声明的局部变量也不能在子级中访问,因为它在CF8下。

所以,我的问题是:是否有希望恢复上述示例中设计的架构?如果没有,是否有一个我丢失的简单迁移技巧?

我的很多代码都希望子拥有的函数能够通过使用SUPER调用“看到”在父代中声明的变量(如上例所示)。对于那些面临从CF8到现在的过渡的人,我会在此感谢您的想法和建议。

2 个答案:

答案 0 :(得分:5)

在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.,以查找您希望与该对象一起使用的变量,并且稍后可由子。

答案 1 :(得分:0)

正如亨利已经指出的那样,你在CF8中的本地实际上是变量范围内的结构,直到你忘记提及某事。通常在那些CF8天,dev会将LOCAL设置为var作用

<cfset var Local={}>

然后其下的任何内容将始终在var范围内。如果您的代码就是这种情况,并且它不再起作用(抱歉无法检查),那么您将遇到一段艰难时期。但是,如果它就像你提到的那样,那么它已经在Variables范围内并且正在改变

<cfset local.parent_val = "Declared in parent instance">

<cfset Variables.parent_val = "Declared in parent instance">

应该有效。如果它没有在CF8中创建任何线程问题,我认为CF10中没有任何理由针对您的具体情况发生(通常这会产生问题)。 我个人认为当我们已经拥有VAR范围时,添加LOCAL范围是个坏主意。我知道高级社区开发者要求它,但这是个坏主意。