我知道在 ColdFusion 中,明确的范围界定是一件好事。自从学习了这一点后,我尝试显式地定义所有变量的范围,即使是查询之类的变量,例如,<cfquery name="local.myQuery">
或<cfquery name="variables.myQuery">
.
我的问题是如何在 .CFM 页面内定义函数时进行显式范围界定,该页面仅在同一页面上使用。我可以做<cffunction name="variables.myFunction">
或类似的事情吗?
我知道在 ColdFusion 中,明确的范围界定是一件好事。自从学习了这一点后,我尝试显式地定义所有变量的范围,即使是查询之类的变量,例如,<cfquery name="local.myQuery">
或<cfquery name="variables.myQuery">
.
我的问题是如何在 .CFM 页面内定义函数时进行显式范围界定,该页面仅在同一页面上使用。我可以做<cffunction name="variables.myFunction">
或类似的事情吗?
用我到目前为止发现的内容发布我自己的答案。@Ageax 评论中的链接将我带到了有关指定函数范围的 ColdFusion 文档。它说:
当您定义 UDF 时,ColdFusion 会将其置于变量范围内。
您可以将 UDF 分配给范围,就像将变量分配给范围一样,通过将函数分配给新范围中的名称。例如,以下行将 MyFunc UDF 分配给 Request 范围:
1: <cfset Request.MyFunc = Variables.MyFunc>
我理解这一点的方式,这意味着我应该简单地使用<cffunction name="myFunction">
来定义函数,但在调用它时我应该使用显式范围,比如variables.myFunction()
.
最佳实践是将该功能从 cfm 页面中取出并将其放入 cfc 类中,然后从您的页面创建该类的实例并使用它。
其他一切最终都会导致眼泪。如果您尝试两次定义具有相同名称的函数, Coldfusion将抛出错误(因此,如果您曾经在包含或包含在此页面中的其他 cfm 中复制此函数,它将崩溃)。
粗略地说,这应该是您的 Thing.cfc 文件:
<cfcomponent>
<cffunction name="myFunction">
</cffunction>
</cfcomponent>
这应该是你的cfm:
<cfset thing = new Thing()>
<cfset thing.myFunction()>
myFunction
将仅限于Thing
类,您将能够在其他类中定义同名函数,甚至在后代类中覆盖它。
尽管 ColdFusion 中的函数能够存在于不同的范围内(默认为variables
),但您不应更改或使用它。只需使用组件来应用封装或将其留在variables
范围内。如果您尝试定义具有相同名称的函数(在相同的 .cfm 或包含的函数中),您将收到一个错误,这应该没问题,因此您不能覆盖这样的函数。
您应该在函数内确定变量的范围。您不会这样做,而是确定函数名称的范围,而是确定内部变量的范围。好的做法是使用local
范围或var
前缀。
<cffunction name="foo">
<cfset var a = 123>
<cfset local.b = 345>
</cffunction>
在 Lucee 中,您可以使用全局定义函数的整个范围localmode="modern"
function foo()localmode="modern"{...}