4

假设我有一个非常简单的控制器,如下所示:

<cfcomponent extends="Controller">
    <cffunction name="hello">
        <cfset time = Now()>
    </cffunction>
</cfcomponent>

在直接的 ColdFusion / Railo 中,我将在此范围内对所有变量进行本地范围界定……但我看到的每个车轮示例都没有。

这可能会为我赢得年度最愚蠢的问题奖,但这是我在考虑的事情,因为似乎没有人证明他们的 Wheels 代码的范围是正确的?

我会这样写:

<cfcomponent extends="Controller">
    <cffunction name="hello">
        <cfset local.time = Now()>
    </cffunction>
</cfcomponent>

我只是不确定 Wheels 是否无论如何都可以解决这个问题,这就是为什么我到处都能看到我在做什么......或者这只是一个糟糕的编程案例?

谢谢!米奇

4

2 回答 2

8

是的,你应该确定它的范围

在您的第一个示例中,在大多数情况下,您是(通过不确定范围)设置variables.time,它是组件实例的本地,而不是函数 - 如果它打算作为函数局部变量(即local.time)但在组件的变量范围内,并且该组件是共享/持久的,这可能会导致问题(尽管可能仅在重负载下才会显示自己)。

如果有意将变量放在变量范围内,则仍应明确范围(如variables.time),否则如果在启用了 localmode 设置的 Railo 服务器上使用它可能会导致问题。

由于 cfWheels 设计决策(请参阅评论中的链接),需要将变量放在变量范围内才能将变量传递给视图,即使它们在技术上可能是函数/视图的本地变量。(控制器实例为单个请求而存在,避免了这通常会带来的问题。)如上一段所述,localmode 设置(如下所述)意味着当您无法控制所有服务器时,仍然建议明确范围代码将被部署到。

Railo 的本地模式设置

Railo (since v1) has had an admin setting called "localmode" which defines whether assigning an unscoped variable will go to the local scope, rather than the component's variables scope - making explicit var/local scoping not required (if you know your code will only be run on Railo servers with that setting enabled).

Since that setting is off by default, and ColdFusion does not have such a setting, cross-engine-compatible code should always scope such variable assignments to avoid this being an issue.

于 2013-01-28T17:45:22.807 回答
4

It depends. If you want the variable to be shown in the view, scope it to variables. If you want the variable to be only in the controller, scope it to local.

于 2013-01-28T17:59:31.907 回答