0

我知道在 ColdFusion 中,明确的范围界定是一件好事。自从学习了这一点后,我尝试显式地定义所有变量的范围,即使是查询之类的变量,例如,<cfquery name="local.myQuery"><cfquery name="variables.myQuery">.

我的问题是如何在 .CFM 页面内定义函数时进行显式范围界定,该页面仅在同一页面上使用。我可以做<cffunction name="variables.myFunction">或类似的事情吗?

4

3 回答 3

0

用我到目前为止发现的内容发布我自己的答案。@Ageax 评论中的链接将我带到了有关指定函数范围的 ColdFusion 文档。它说:

当您定义 UDF 时,ColdFusion 会将其置于变量范围内。

您可以将 UDF 分配给范围,就像将变量分配给范围一样,通过将函数分配给新范围中的名称。例如,以下行将 MyFunc UDF 分配给 Request 范围:

1: <cfset Request.MyFunc = Variables.MyFunc>

我理解这一点的方式,这意味着我应该简单地使用<cffunction name="myFunction">来定义函数,但在调用它时我应该使用显式范围,比如variables.myFunction().

于 2019-08-29T01:14:28.137 回答
0

最佳实践是将该功能从 cfm 页面中取出并将其放入 cfc 类中,然后从您的页面创建该类的实例并使用它。

其他一切最终都会导致眼泪。如果您尝试两次定义具有相同名称的函数, Coldfusion抛出错误(因此,如果您曾经在包含或包含在此页面中的其他 cfm 中复制此函数,它将崩溃)。

粗略地说,这应该是您的 Thing.cfc 文件:

<cfcomponent>
  <cffunction name="myFunction">
  </cffunction>
</cfcomponent>

这应该是你的cfm:

<cfset thing = new Thing()>
<cfset thing.myFunction()>

myFunction将仅限于Thing类,您将能够在其他类中定义同名函数,甚至在后代类中覆盖它。

于 2019-08-28T18:24:29.783 回答
0

尽管 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"{...}
于 2019-09-15T19:04:01.930 回答