2

假设我有以下名为Base的组件:

<cfcomponent output="false">

    <cffunction name="init" access="public" returntype="Any" output="false">
        <cfset variables.metadata = getmetadata(this)>
        <cfreturn this>
    </cffunction>

    <cffunction name="getmeta" access="public" returntype="Any" output="false">
        <cfreturn variables.metadata>
    </cffunction>

</cfcomponent>

我想在另一个名为Admin的组件中扩展 base :

<cfcomponent output="false" extends="Base">
</cfcomponent>

现在在我的应用程序中,如果我在创建对象时执行以下操作:

<cfset obj = createobject("component", "Admin").init()>
<cfdump var="#obj.getmeta()#">

我得到的元数据告诉我该组件的名称是Admin并且它正在扩展我的Base组件。这一切都很好,但我不想在创建对象时显式调用init()方法。

如果我能在我的Base组件中做这样的事情,我会很好:

<cfcomponent output="false">

    <cfset init()>

    <cffunction name="init" access="public" returntype="Any" output="false">
        <cfset variables.metadata = getmetadata(this)>
        <cfreturn this>
    </cffunction>

    <cffunction name="getmeta" access="public" returntype="Any" output="false">
        <cfreturn variables.metadata>
    </cffunction>

</cfcomponent>

然而,getmeta() 方法返回的元数据告诉我组件名称是Base,即使它仍在扩展中。关于如何做到这一点的任何想法?

4

3 回答 3

1

我不是 100% 确定你在追求什么,但 ColdFusion 8 添加了 getComponentMetaData() 函数,它不需要实例化的 CFC,而是采用点符号路径到 CFC。您应该能够从 Admin 获取路径,您可以将其传递给 getComponentMetaData() 而无需调用 Base 上的 init()。

ColdFusion LiveDoc:getComponentMetaData()

于 2008-12-17T16:20:39.833 回答
1

您是否有理由不想在每个扩展的 cfc 中调用 init?

<cfcomponent output="false" extends="Base">
    <cfset super.init()>

</cfcomponent>

这似乎像你想要的那样填充元数据。

于 2008-12-12T20:50:22.680 回答
1

6岁,但我会给出真正的答案......

给定 Base.cfc:

component{
    public function foo(){
        return 'base';
    }
}

和 Child.cfc:

component extends="Base"{
    public function foo(){
        return 'child';
    }
}

要找出 Child 扩展的组件,只需执行以下操作:

<cfscript>
child = createObject( "component", "Child" );
writeDump( getMetaData(child).extends.name );
</cfscript>
于 2014-09-15T16:32:17.727 回答