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

包含文件中的ColdFusion用户定义函数是';不可用,coldfusion,user-defined-functions,coldfusion-9,Coldfusion,User Defined Functions,Coldfusion 9,我正在使用ColdFusion 9 我包括一个UDF库(UDF_library.cfm),其中只有几个函数。当我试图访问函数时,我得到一个错误,上面写着“变量弹出未定义”。该库作为onRequestStart方法的第一部分包含在Application.cfc中 以下是我如何将库包括在内: <cfscript> // INCLUDE UDF_LIBRARY include "/UDF/UDF_Library.cfm"; </cfscript> <c

我正在使用ColdFusion 9

我包括一个UDF库(UDF_library.cfm),其中只有几个函数。当我试图访问函数时,我得到一个错误,上面写着“变量弹出未定义”。该库作为onRequestStart方法的第一部分包含在Application.cfc中

以下是我如何将库包括在内:

<cfscript>
// INCLUDE UDF_LIBRARY
include "/UDF/UDF_Library.cfm";
</cfscript>         
<cfscript>
function popUp() {
    return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
}
</cfscript>         

//包括UDF_库
包括“/UDF/UDF_Library.cfm”;
以下是图书馆的内容:

<cfscript>
// INCLUDE UDF_LIBRARY
include "/UDF/UDF_Library.cfm";
</cfscript>         
<cfscript>
function popUp() {
    return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
}
</cfscript>         

函数popUp(){
返回“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”;
}
我知道这个功能是有效的。当我直接将函数写入文件并调用函数时,它工作得很好

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

writeOutput(popUp());
函数popUp(){
返回“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”;
}

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

我认为要使函数普遍可用,它们必须包含在onRequest()中,而不是onRequestStart()中。

我认为要使函数普遍可用,它们必须包含在onRequest()中,不是onRequestStart()。

我认为最好将UDF库存储在应用程序或会话之类的持久作用域中。就我个人而言,我会遵循Ben Nadel在这里讨论的模式:

我认为最好将UDF库存储在应用程序或会话之类的持久作用域中。就我个人而言,我会遵循Ben Nadel在这里讨论的模式:

我认为此处所有指南中缺少的信息是一个建议,即了解变量作用域是如何工作的,这与在哪个Application.cfc事件处理程序中可以声明函数无关

Application.cfc事件处理程序不会对最初在其内部声明的内容赋予任何神奇的持久性:仍然需要将任何声明的变量或函数放入适合于访问它们的方式的范围内。在onRequestStart(或onRequest)中声明变量并不能神奇地使该变量对请求中的所有内容都可用。函数只是一个变量

当包含一个文件时——就像您正在做的那样——任何变量声明(以及相应的函数声明)都驻留在您放入它们的任何范围内。如果一个人声明了一个函数,并且没有做更多的事情,那么这个函数只存在于variables范围内

如果在onRequestStart()中声明一个函数,它只是在每个请求开始时创建的Application.cfc实例中的一个方法,那么该函数将放在该cfc实例的变量范围内。它的寿命正好与CFC实例的寿命一样长。就onRequestStart()的执行而言,CFC实例持续运行onRequestStart()所需的时间。没多久

另一方面,onRequest()不是事件处理程序(就像onRequestStart()一样),它是一个事件拦截器:它发生而不是它截获的事件。一般来说,onRequest()包括被请求的模板。因此,被请求的模板与包含它的CFC实例在相同的内存空间中运行(通过onRequest()),因此包含的模板共享CFC实例的变量范围,并相应地共享onRequest()可用的变量范围。因此,如果onRequest()包含一个UDF库,该库在变量范围内声明一组函数。。。这与onRequest()拦截器中包含的主请求文件的变量范围相同。与包含文件的任何其他CFC实例方法相同

所以。。。这样做的结果是,仅仅在onRequestStart()中包含一个充满函数的文件并不能满足您的需要,原因很明显,现在希望如此。同样,在onRequest()中包含一个充满函数的文件并不会给它们带来神奇的持久性:它们只是放在variables范围内。这意味着它们可以被请求的模板以及其中包含的任何模板访问。它们将不可用于任何自定义标记,也不可用于该请求中使用的任何CFC实例

如果希望某个函数(或“某些函数”)可用于请求中的任何代码,则需要将这些函数放入请求范围(或另一个共享范围)。实现这一点的方法与使用任何变量的方法相同:

request.something  = somethingElse;

就这样。这是唯一的办法。包含一个包含全部函数的文件对于您想要做的事情来说并不是一个完整的解决方案,无论您如何包含它。

我认为这里所有指南中缺少的信息都是一个关于了解变量作用域如何工作的建议,它与可以在哪个Application.cfc事件处理程序中声明函数无关

Application.cfc事件处理程序不会对最初在其内部声明的内容赋予任何神奇的持久性:仍然需要将任何声明的变量或函数放入适合于访问它们的方式的范围内。在onRequestStart(或onRequest)中声明变量并不能神奇地使该变量对请求中的所有内容都可用。函数只是一个变量

当包含一个文件时——就像您正在做的那样——任何变量声明(以及相应的函数声明)都驻留在您放入它们的任何范围内。如果一个人声明了一个函数,并且没有做更多的事情,那么这个函数只存在于variables范围内

如果在onRequestStart()中声明一个函数,它只是在每个请求开始时创建的Application.cfc实例中的一个方法,那么该函数将放在该cfc实例的变量范围内。它的寿命正好与CFC实例的寿命一样长。就onRequestStart()的执行而言,CFC实例持续运行onRequestStart()所需的时间。没多久

在ot上