5

我注意到,当我调用以前包含的 (cfinclude) .cfm 文件的函数时,此时发生的所有冷融合导入 (cfimport) 都被遗忘了。就像你没有导入任何东西一样。我发现了这种非常奇怪的行为,因此我将其隔离,但结果保持不变,即使在冷融合 10 中也是如此。

我的设置:

/例子

  • 函数.cfm
  • 索引.cfm
  • /组件
    • 我的CFC.cfc

函数.cfm:

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

组件/MyCFC.cfc:

component  output="false"{}

索引.cfm:

<cfscript>
  include "functions.cfm";
  import components.MyCFC;
foo = test(); bar = new MyCFC(); </cfscript>

此代码将引发冷融合错误:“找不到 ColdFusion 组件或接口 MyCFC”。当foo = test();被删除或放置在 之后bar = new MyCFC();,代码运行得很好。

导入是放在包含之前还是之后都没有关系。每当调用包含的函数时,都会忘记导入。

这是一个错误还是应该以这种方式表现?

在coldfusion 9,0,0,251028和coldfusion 10,282462中测试

4

2 回答 2

3

因为我做了很多导入,我最近遇到了一些奇怪的行为,并报告它做 CF9-bugbase: https ://bugbase.adobe.com/index.cfm?event=bug&id=3288035

ColdFusion 仅解析当前文件的导入,每当您调用不同的文件时,就像“执行上下文”切换到带有导入的文件一样。因此,在您执行new ColdFusion 的情况下,会在functions.cfm中查找导入。然后,当您调用当前文件的方法时,它会切换回来并找到导入。

如果我是对的,如果您bar = new MyCFC();在导入后直接执行,您的代码应该可以工作。或者,您可以在index.cfm中定义另一个方法并在创建类之前调用​​它。

要解决该错误,您需要确保在“上下文切换”发生之前解决导入(在对象生命周期中首次使用时)。所以new MyCFC();在外部方法之前调用。

@Adobe:解决这个问题会很好;)

于 2012-09-25T10:05:01.260 回答
1

我和@PeterBoughton 在一起,这听起来像是一个错误。我也找不到类似的错误报告,所以我会继续提交它。同时,如果您取消“导入”,您应该仍然可以使用以下方式引用 CFC:

bar = new components.MyCFC();

很棒的收获!

于 2012-09-24T14:55:28.723 回答