我在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到现在的过渡的人,我会在此感谢您的想法和建议。
答案 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范围是个坏主意。我知道高级社区开发者要求它,但这是个坏主意。