使用包含文件的功能使coldfusion忘记导入。这是正常的吗?

问题描述 投票:5回答:2

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

我的设置:

/例

  • functions.cfm
  • index.cfm
  • /组件 MyCFC.cfc

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中进行了测试

coldfusion coldfusion-9 coldfusion-10 cfimport
2个回答
3
投票

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

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

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

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

@Adobe:很高兴解决这个问题;)


1
投票

我和@PeterBoughton一起,听起来像个臭虫。我找不到报告类似的bug,所以我会继续提交它。同时如果您废弃“导入”,您仍然可以使用以下方式引用CFC:

bar = new components.MyCFC();

很棒!

© www.soinside.com 2019 - 2024. All rights reserved.