我希望有人可以解释这种行为,因为我发现它非常恶化。我有一个带有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从类本身调用时正常工作?有更好的解决方法吗?
答案 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
范围内整个实例化类的公共成员来访问。父级不能引用扩展(子)对象内的私有变量。但是父母可以引用公共成员。