Application.cfc函数中的变量是否需要作用域?

时间:2011-11-18 19:29:16

标签: coldfusion application.cfc

人群的问题。我们的团队非常严格地在CFC中的函数内部定义局部变量。最近虽然在Application.cfc中确定了变量范围的问题。像onRequestStart()这样的函数中的未映射变量是否存在被同时运行的其他会话访问的相同风险,因为我们知道其他组件中的函数中的局部变量是?或者由于Application.cfc中函数的性质,它们在某种程度上被区别对待?

1 个答案:

答案 0 :(得分:12)

您的问题与两个完全不同的问题相关(这两个问题都很重要,需要澄清和解决)。这两个问题是:

  1. 在引用变量时,我应该正确调整变量的范围(例如,APPLICATION.settings vs. SESSION.settings)。
  2. 对此的简短回答是:。它使代码更清晰,更易读/可管理,并防止在以后重新使用变量名时可能遇到的变量范围冲突。

    如果您创建了APPLICATION.settings和SESSION.settings,但尝试在没有范围的情况下引用它们(即。<cfset myvar = settings />),那么您将会遇到变量冲突问题,因为它们会被转换为VARIABLES默认情况下 - 因为APPLICATION和SESSION都不会被检查以解决范围歧义。

    第二个问题是:

    1. 我是否应该担心Application.cfc中访问的变量可能会被并发环境中的多个用户共享?
    2. 对此的简短回答是:。你应该知道&amp;了解共享变量访问方式的后果,并在适当的时候<CFLOCK>

      不幸的是,确切地说,锁定共享变量的时间和位置通常都不会向CF社区说明,所以让我总结一下:

      1. onApplicationStart()单线程访问APPLICATION范围。您无需锁定在此方法中读/写的APPLICATION变量。
      2. onSessionStart()单线程访问SESSION范围。和以前一样的答案。
      3. 如果您提供任何类型的机制,可以在onRequestStart()方法中访问SESSION或APPLICATION - 或者之后的任何其他模板(例如直接调用onApplicationStart()的URL重载参数) - 所有投注都已关闭 - 您现在必须正确处理共享变量读写的锁定。