必须在扩展类中使用OnMissingMethod的“this”范围

时间:2013-07-09 21:23:39

标签: coldfusion coldfusion-8 cfml

我希望有人可以解释这种行为,因为我发现它非常恶化。我有一个带有OnMissingMethod实现的父类来提供隐式getter / setter(旧的CF8应用程序)

如果我将子类实例化为 foo 并从外部文件调用 foo.getBar(),它会成功触发OnMissingMethod,但如果在foo类本身内我调用 getBar()它没有。触发OnMissingMethod的唯一方法是使用 this.getBar(),我不喜欢美观和代码不一致的原因。

tldr;这是一个代码示例...亲自尝试。

Foo.cfc

<cfcomponent output="false" extends="Parent">

        <cffunction name="init" output="false" returntype="Foo">
            <cfreturn this />
        </cffunction>

        <cffunction name="getInternalBar_workie">
            <cfreturn this.getBar() />
        </cffunction>

        <cffunction name="getInternalBar_noworkie">
            <cfreturn getBar() />
        </cffunction>

</cfcomponent>

Parent.cfc

<cfcomponent output="false">

    <cffunction name="OnMissingMethod">
        <!--- always return true for this example --->
        <cfreturn true />
    </cffunction>

</cfcomponent>

foobar.cfm

<cfset foo = CreateObject( "component", "Foo").init() />

<!--- this works --->
<cfdump var="#foo.getBar()#" /><br/>
<!--- this works --->
<cfdump var="#foo.getInternalBar_workie()#" /><br/>
<!--- this fails --->
<cfdump var="#foo.getInternalBar_noworkie()#" />

任何人都可以解释为什么这个&#39;范围必须用于OnMissingMethod从类本身调用时正常工作?有更好的解决方法吗?

2 个答案:

答案 0 :(得分:2)

谢天谢地。我不知道答案,但用Google搜索“冷却这个范围”,第一场比赛解释了你的情况in one of the comments。我对复制艾略特的作品感到不好,但是你的问题得到了解答:

  

[...]

     

CFC只是代理页面。 CreateObject()返回TemplateProxy   它包装了你真正代码的CFPage。

     

[...]

     

当您将该函数称为“this.getFoo()”或来自。时   在外面是“myObject.getFoo()”,而不是它调用的内容   TemplateProxy上用于调用方法的方法,该方法依次调用   在代理页面上调用该函数。

     

OnMissingMethod处理存在于invoke()函数上   TemplateProxy,因此它只能从外部或通过此工作   范围。

     

[...]

答案 1 :(得分:-1)

这显示了公共成员和私人成员之间的区别。致getBar()的电话不是公众this.getBar()的捷径。这是私人variables.getBar()的快捷方式,Parent.cfc中不存在。私有函数variables.getBar()仅存在于Foo.cfc的变量范围内。因为它是一个公共函数,所以它也可以作为this范围内整个实例化类的公共成员来访问。父级不能引用扩展(子)对象内的私有变量。但是父母可以引用公共成员。