4

我希望有人可以解释这种行为,因为我觉得这很令人恼火。我有一个带有 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>

父.cfc

<cfcomponent output="false">

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

</cfcomponent>

foob​​ar.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()#" />

谁能解释为什么在从类本身调用时必须使用“this”范围才能使 OnMissingMethod 正常工作?有更好的解决方法吗?

4

2 回答 2

2

感谢谷歌。我不知道答案,但用谷歌搜索“coldfusion onmissingmethod this scope”,第一场比赛在其中一个评论中解释了你的情况。我对复制 Elliott 的作品感到难过,但它回答了你的问题:

[...]

CFC 只是代理页面。CreateObject() 返回一个 TemplateProxy,它包装了作为您的实际代码的 CFPage。

[...]

当您将函数调用为“this.getFoo()”或从外部调用为“myObject.getFoo()”时,它会调用 TemplateProxy 上的一个方法来调用一个方法,而后者又会调用该函数代理页面。

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

[...]

于 2013-07-09T21:51:13.627 回答
-1

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

于 2013-07-09T21:56:50.667 回答