我注意到当我调用之前包含的(cfinclude).cfm文件的函数时,此时发生的所有coldfusion导入(cfimport)都被遗忘了。这就像你没有进口任何东西。我发现这种非常奇怪的行为所以我已经将它隔离了,但结果保持不变,即使在coldfusion 10中也是如此。
我的设置:
/例
functions.cfm:
<cfscript>
function test(){
return "test";
}
</cfscript>
组件/ MyCFC.cfc:
component output="false"{}
index.cfm:
<cfscript>
include "functions.cfm";
import components.MyCFC;
foo = test();
bar = new MyCFC();
</cfscript>
此代码将抛出coldfusion错误:“找不到ColdFusion组件或接口MyCFC”。当foo = test();
被移除或放置在bar = new MyCFC();
之后,代码运行得很好。
如果在包含之前或之后放置导入并不重要。每当调用包含的函数时,都会忘记导入。
这是一个错误还是它应该以这种方式表现?
在coldfusion 9,0,0,251028和coldfusion 10,282462中进行了测试
由于我做了很多进口,我最近遇到了一些奇怪的行为并报告它做了CF9-bugbase:https://bugbase.adobe.com/index.cfm?event=bug&id=3288035
ColdFusion仅解析当前文件的导入,每当您调用另一个文件时,它就像“执行上下文”切换到带有导入的文件。因此,在您执行新的ColdFusion的情况下,在functions.cfm中查找导入。然后,当您调用当前文件的方法时,它会切换回来并找到导入。
如果我是对的,如果你在导入后直接执行bar = new MyCFC();
,你的代码应该可行。或者,您可以在创建类之前在index.cfm中定义另一个方法并调用它。
要解决该错误,您需要确保在“上下文切换”发生之前解析导入(在对象生命周期中首次使用)。所以在外部方法之前调用new MyCFC();
。
@Adobe:很高兴解决这个问题;)
我和@PeterBoughton一起,听起来像个臭虫。我找不到报告类似的bug,所以我会继续提交它。同时如果您废弃“导入”,您仍然可以使用以下方式引用CFC:
bar = new components.MyCFC();
很棒!