Evi*_*mes 1 coldfusion user-defined-functions coldfusion-9
我正在使用ColdFusion 9.
我包含一个UDF库(UDF_Library.cfm),它只有一些函数.当我尝试访问这些函数时,我收到一条错误,上面写着"变量POPUP未定义".该库作为onRequestStart方法的第一部分包含在Application.cfc中.
这是我如何包含库:
<cfscript>
// INCLUDE UDF_LIBRARY
include "/UDF/UDF_Library.cfm";
</cfscript>
Run Code Online (Sandbox Code Playgroud)
这是图书馆的内容:
<cfscript>
function popUp() {
return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
}
</cfscript>
Run Code Online (Sandbox Code Playgroud)
我知道这个功能有效.当我直接将函数写入文件并调用函数时,它工作正常.
<cfscript>
writeOutput(popUp());
function popUp() {
return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
}
</cfscript>
Run Code Online (Sandbox Code Playgroud)
为什么在加载页面的任何部分之前,在application.cfc文件中包含在UDF中时看不到该函数?
我认为这里所有指导中缺少的信息是一个了解变量作用域如何工作的建议,这与可能声明函数的Application.cfc事件处理程序无关.
Application.cfc事件处理程序不会对最初在其中声明的内容赋予任何神奇的持久性:还需要将任何声明的变量或函数放入适合于它们访问方式的范围内.在onRequestStart(或onRequest)中声明变量并不会神奇地使该变量可用于请求中的所有内容.函数只是一个变量.
当一个文件包含一个文件时 - 就像你正在做的那样 - 任何变量声明(以及相应的函数声明)都驻留在一个放入它们的任何范围内.如果一个声明一个函数,并且不再对它做任何事情,那么该函数只存在于变量中范围.
如果在onRequestStart()中声明了一个函数,它只是在每个请求开始时创建的Application.cfc实例中的一个方法,那么该函数将被放入该CFC实例的变量范围内.并且将持续恰好与该CFC实例的生命一样长.就onRequestStart()的执行而言,只要运行onRequestStart(),CFC实例就会持续.所以不久.
另一方面,onRequest()不是事件处理程序(如onRequestStart()是),它是一个事件拦截器:它发生而不是它截获的事件.通常,onRequest()包括 - 字面上 - 所请求的模板.因此,请求的模板在与包含它的CFC实例相同的内存空间中运行(通过onRequest()),因此包含的模板共享CFC实例的变量范围,因此变量范围可用于onRequest().因此,如果onRequest()包含一个UDF库,它在变量作用域中声明了一堆函数...那就是与onRequest()拦截器中包含的主要请求文件相同的变量作用域.与包含文件的任何其他CFC实例方法相同.
所以......这样做的结果是简单地在onRequestStart()中包含一个充满函数的文件并不能满足您的需求,因为 - 希望现在 - 显而易见的原因.在onRequest()中同样包含一个充满函数的文件并不会给它们带来神奇的持久性:它们只是放在变量范围内.这意味着它们可以访问所请求的模板及其包含的任何模板.它们不可用于任何自定义标记,也不可用于该请求中使用的任何CFC实例.
如果想要一个函数(或"某些函数")可用于请求中的任何代码,则需要将这些函数放入请求范围(或另一个共享范围).这样做的方法与任何变量相同:
request.something = somethingElse;
Run Code Online (Sandbox Code Playgroud)
而已.这是做到这一点的唯一方法.包括一个充满功能的文件将不是您希望做的完整解决方案,无论您如何包含它.
| 归档时间: |
|
| 查看次数: |
1329 次 |
| 最近记录: |