ColdFusion mixin导致“例程不能被多次声明”。

时间:2012-06-27 18:38:53

标签: coldfusion mixins

[注意:在cfcs中包含代码通常是不好的做法,(请参阅下面的答案),所以请考虑这只是研究]

总而言之,我有一个类和一个子类以及一个被子类覆盖的方法。当我在子类中对方法进行硬编码时,一切正常,当我使用cfinclude将它包含在伪构造函数中时,mixin样式,我得到一个“例程不能被多次声明”。错误。

这看起来非常简单。我想念的是什么:这个混合?

父类:

<cfcomponent >
    <cffunction name="hola" hint="i am the parent method">
        <cfreturn "hola - parent">
    </cffunction>
</cfcomponent>

儿童班:

<cfcomponent extends="mixinTestParent">
    <!---   this would work, successfully overridding parent method
    <cffunction name="hola" hint="i am the child method">
        <cfreturn "hola - child">
    </cffunction>--->

    <cfinclude template="mixinTestInc.cfm">

    <cffunction name="init" access="public" returntype="any" output="false">
        <cfreturn this>
    </cffunction>
</cfcomponent>

包括:

<cffunction name="hola" hint="i am the child method" access="public">
        <cfreturn "hola - child">
    </cffunction> 

转轮:

<cfset test = new mixinTestChild().init()>
<cfdump var="#test.hola()#">

提前感谢!!

4 个答案:

答案 0 :(得分:7)

由于实例化CFC的方式,您收到错误。

当您在父母和父母身份中有hola()时子项中hola(),子项扩展父项,当创建子CFC时,它在父项中看到hola()并覆盖它。但是,该功能仍存在于CFC中。

从子CFC,您可以引用hola()(在子CFC中定义)和super.hola()(在父级中定义)。

使用<cfinclude/>时,将实例化CFC,并将包含文件的内容添加到组合中。但是,它们不被视为继承模型的一部分,就像“此CFC中的其他函数”一样,因此您会收到错误。

我同意这是一个不好的做法,而不是重构,但它是一个很好的方法,允许实用程序UDF进入混合,而不会使它们成为您的模型的一部分。

答案 1 :(得分:1)

我认为在cfc中使用cfinclude通常是不好的做法。此外,我认为此链接与您的问题相关:http://www.bennadel.com/blog/972-CFCs-Are-Cached-CFIncludes-Are-Not.htm

答案 2 :(得分:1)

我认为你可以让你的东西工作,但你做你正在做的事情根本不是一个好主意。包括管理文本和HTML以及向屏幕输出信息的工作。它不习惯包含功能。

我找到了你:http://www.justskins.com/forums/is-cfincludeing-from-cfcs-81144.html

  

与Sean Corfield交换电子邮件后的后续行动   Macromedia的架构。

     

他说,从CFC函数中包含文件“是不好的做法”。一世   个人认为简化CFC是一种很好的做法,但他说   不使用cfinclude鼓励人们“将他们的CFC重构为更小的,   更有凝聚力的CFC。“

     

至于将“var”变量复制到包含文件的Variables范围中,   根据肖恩的说法,这是一个CFMX 6.1错误,已在CF7中修复。

     肖恩没有具体说使用cfinclude会导致错误,但我   我倾向于相信这种做法确实导致了我们奇怪的错误。我们的   错误与变量范围无关,我相信它们会是   现在解决了我们在我们的服务器上添加了RAM,但这并不是说   cfinclude没有贡献。

     

CF的文档确实说使用cfinclude是可以的,所以我们可能   在将我们的所有代码都移到CFC本身之前运行一些测试。

答案 3 :(得分:0)

只是为了添加@iKnowKungFoo的答案,问题是<cfinclude>不是“在这里粘贴代码的简写,好像它实际上是文件的一部分”,如#include我会说这是因为这是大多数人认为工作的方式。

在C中,#include是一个编译器指令(不是C代码,本身),实际上,包含文件中的代码在编译之前实际包含在文件中。

在CF中,这不是发生的事情。包含的文件是单独编译的,然后发生了一些Java jiggery-pokery(对于技术术语;-)感到遗憾,使得包含的代码与包含它的代码内联(如果有意义的话)。

现在......这有什么影响?编译CFM文件时,其中的函数编译为UDF,它没有任何继承或覆盖的概念或类似的东西,因为它们不是那种上下文。只有在编译 CFC 时才会实现所有这些内容。基本上CFM不是在考虑OO的情况下编制的,而CFC具体是。

因此,UDF的一个规则是每个请求只能有一个给定名称的函数......这可以通过创建包含文件的CFM(其中包含hola()的文件来证明) )连续两次:你会得到一个错误。现在为什么这个规则到位我不知道。对我来说,函数只是一个变量,所以同名的第二个函数声明应该只覆盖前一个。然而,CF一直都是这样的,所以我们现在应该习惯它。对于代码,UDF(在include中)与CFC中的方法具有相同的名称,这足以使错误情况发生。这有点意义。

这是否有助于澄清正在发生的事情,以及为什么您会看到您所看到的内容?