包含文件中的ColdFusion用户定义函数不可用

时间:2011-09-07 17:12:51

标签: 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>         

以下是图书馆的内容:

<cfscript>
function popUp() {
    return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
}
</cfscript>         

我知道这个功能有效。当我直接将函数写入文件并调用函数时,它工作正常。

<cfscript>
writeOutput(popUp());
function popUp() {
    return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
}
</cfscript>         

为什么在加载页面的任何部分之前,在application.cfc文件中包含在UDF中时看不到该函数?

3 个答案:

答案 0 :(得分:5)

我认为这里所有指导中缺少的信息是一个了解变量作用域如何工作的建议,这与可能声明函数的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;

就是这样。这是做到这一点的唯一方法。包括一个充满功能的文件将不是您想要做的完整解决方案,无论您如何包含它。

答案 1 :(得分:2)

我相信功能普遍可用,它们必须包含在onRequest()中,而不是onRequestStart()。

答案 2 :(得分:2)

我认为将UDF库存储在像应用程序或会话这样的持久范围中会更好。就个人而言,我会遵循Ben Nadel在这里讨论的模式:http://www.bennadel.com/blog/257-My-ColdFusion-User-Defined-Function-Library-Structure.htm