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

Rob*_*hle 3 coldfusion application.cfc

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

Sha*_*mes 12

你的问题接近两个完全不同的问题(这两个问题都很重要,需要澄清和解决).这两个问题是:

  1. 我应该在引用变量时正确调整变量的范围(即APPLICATION.settings与SESSION.settings).

对此的简短回答是:是的.它使代码更清晰,更易读/可管理,并防止在以后重新使用变量名时可能遇到的变量范围冲突.

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

第二个问题是:

  1. 我是否应该担心在Application.cfc中访问的变量可能会被并发环境中的多个用户共享?

对此的简短回答是:是的.您应该了解并了解共享变量的访问方式以及<CFLOCK>适当的访问方式.

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

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