函数和存储过程不能有相同的名称?

Dou*_*idy 1 coldfusion

我写了一个函数:

function getArtists(where='', artistactive = true){
   //yadayada
   return artists;
}
Run Code Online (Sandbox Code Playgroud)

并在以下之后将其包含在模板中

<cfstoredproc datasource="#request.dsn#" procedure="GetArtists">
    <cfprocresult name="GetArtists">
</cfstoredproc>
Run Code Online (Sandbox Code Playgroud)

这会产生错误:

例程不能多次声明.例程getArtists已在不同的模板中声明两次

好的,问题1:ColdFusion认为函数和存储过程都是"例程",不能声明两次?

所以,我接下来要做的就是在存储过程之前包含我的函数模板......这似乎没问题.

问题2:给出了什么?

Mar*_*ger 5

你应该相信错误.在测试代​​码时,我在声明函数然后调用同名的存储过程时没有错误.当我使用I转储变量范围时,<cfdump var="#variables#">看到结果集(而不是函数),因为该函数已被结果集覆盖.如果我在声明函数后尝试调用该函数然后覆盖它,我会得到"Incorrect entity type for being a function"我的错误.

请记住,CF编译器会遍历您的代码并首先编译UDF和组件.它们不是在运行时编译的.您引用的错误发生在编译期间,而不是运行时.出于这个原因,我认为你的UDF例程实际上被包含多次的可能性更大.查看底部的调试信息并搜索该文件,看看是否是这种情况 - 或者检查自定义标记调用以及文件加倍的其他方法.

建议:作为一项规则,UDF应该在他们自己的空间中声明(onRequest()是它的一个好地方),应该保护它免受这种事情的影响.我使用像"lib"这样的变量并将我的函数(它们就像Java中的对象的成员一样)存储为lib.function1(),lib.function2().你这样做会导致不可预测性.最后一点只是我的意见 - 试图提供帮助.:)