假设我有一个非常简单的控制器:
<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是否可以采取措施来解决这个问题,这就是为什么我看到我到处都做的事情......或者只是一个糟糕的编程案例?
谢谢! MIKEY
答案 0 :(得分:8)
是的,你应该确定它。
在你的第一个例子中,在大多数情况下,你是(通过不作用域)设置variables.time
,它是组件实例的本地,而不是函数 - 如果这是作为函数局部变量(即local.time
)但是在组件的变量范围内,并且该组件是共享/持久化的,这可能会导致问题(尽管可能只会在重负载下显示自己)。
如果将变量置于变量范围内是故意的,那么它仍应明确作用域(如variables.time
),否则如果在启用了localmode设置的Railo服务器上使用它可能会导致问题。
由于cfWheels设计决策(请参阅注释中的链接),将变量放在变量范围内需要将变量传递给视图,即使它们在技术上可能是函数/视图的本地变量。 (控制器实例只针对单个请求,避免了通常需要的问题。)如前一段所述,localmode设置(如下所述)意味着当您无法控制所有服务器时,仍建议明确指定范围。代码将部署到。
Railo(自v1开始)有一个名为“localmode”的管理设置,它定义了分配一个未操作的变量是否会转到本地范围,而不是组件的变量范围 - 不需要显式的var / local范围(如果你知道的话)您的代码只能在启用了该设置的Railo服务器上运行。
由于默认情况下该设置处于关闭状态,并且ColdFusion没有这样的设置,因此跨引擎兼容的代码应始终包含此类变量分配,以避免出现问题。
答案 1 :(得分:4)
这取决于。如果希望变量显示在视图中,请将其范围限定为变量。如果您希望变量仅在控制器中,请将其范围限定为本地。