CFWheels - 我应该在本地确定我的车轮动作范围吗?

Mic*_*umo 4 coldfusion railo cfwheels cfml

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

<cfcomponent extends="Controller">
    <cffunction name="hello">
        <cfset time = Now()>
    </cffunction>
</cfcomponent>
Run Code Online (Sandbox Code Playgroud)

在直接的ColdFusion/Railo中,我会在本地范围内查找所有变量......但是我看到的每个轮子都没有.

这可能会让我获得年度奖项中最愚蠢的问题,但这是我想到的,因为似乎没有人能够正确展示他们的Wheels代码范围?

我会写如下:

<cfcomponent extends="Controller">
    <cffunction name="hello">
        <cfset local.time = Now()>
    </cffunction>
</cfcomponent>
Run Code Online (Sandbox Code Playgroud)

我不确定Wheels是否可以采取措施来解决这个问题,这就是为什么我看到我到处做什么......或者只是一个糟糕的编程案例?

谢谢!米奇

Pet*_*ton 8

是的,你应该确定它.

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

如果将变量放在变量范围内是故意的,那么它应该仍然是显式范围的(as variables.time),否则如果在启用了localmode设置的Railo服务器上使用它可能会导致问题.

由于cfWheels设计决策(参见注释中的链接),将变量放在变量范围内需要将变量传递给视图,即使它们在技术上可能是函数/视图的本地变量.(控制器实例只针对单个请求,避免了通常需要的问题.)如前一段所述,localmode设置(如下所述)意味着当您无法控制所有服务器时,仍建议明确指定范围.代码将部署到.

Railo的本地模式设置

Railo(自v1起)有一个名为"localmode"的管理设置,它定义了分配一个未编组的变量是否会转到本地范围,而不是组件的变量范围 - 不需要显式的var/local范围(如果你知道你的代码将会仅在启用了该设置的Railo服务器上运行).

由于默认情况下该设置处于关闭状态,并且ColdFusion没有这样的设置,因此跨引擎兼容的代码应始终包含此类变量分配,以避免出现问题.