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

<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 是否可能会采取一些措施来解决这个问题,这就是为什么我看到我在任何地方所做的事情......或者这只是一个糟糕的编程案例?

谢谢!
米奇

最佳答案

是的,您应该将其范围限定为

在您的第一个示例中,您在大多数情况下(通过不进行范围界定)设置 variables.time ,它是组件实例的局部变量,而不是函数 - 如果这是作为函数局部变量(即 local.time )但在组件的可变范围,并且该组件是共享/持久化的,这可能会导致问题(尽管可能只有在重负载下才会出现问题)。

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

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

Railo 的 localmode 设置

Railo(自 v1 起)有一个名为“localmode”的管理设置,它定义分配一个无作用域的变量是否将进入局部作用域,而不是组件的变量作用域——不需要显式的 var/local 作用域(如果你知道你的代码会仅在启用该设置的 Railo 服务器上运行)。

由于默认情况下该设置是关闭的,而 ColdFusion 没有这样的设置,跨引擎兼容的代码应始终对此类变量赋值进行作用域,以避免出现此问题。

关于coldfusion - CFWheels - 我应该在本地确定我的 Wheels 操作吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14567892/

10-11 04:43