Я надеюсь, что кто-то может объяснить это поведение, поскольку я нахожу это довольно усугубляющим. У меня есть родительский класс с OnMissingMethod реализации, чтобы обеспечить неявные добытчиками/сеттеры (старые приложения CF8)Необходимость использования этой возможности с OnMissingMethod в расширенном классе
если экземпляр класса ребенка, как 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()#" />
Может кто-нибудь объяснить, почему 'this' scope должен использоваться для OnMissingMethod для правильной работы при вызове из самого класса? Есть ли лучшее обходное решение?
После рассмотрения ответа Адама, похоже, вы застряли. Какова фактическая проблема, которую вы пытаетесь решить, вызвав несуществующие методы таким образом? – imthepitts
У меня есть большой объем услуг (+/- 1000), которые имеют зависимости от других сервисов. Я использую ColdSpring для управления DI и инъекционными услугами, используя инъекцию свойств. Это, конечно, требует наличия доступного геттера для внедренной службы внутри целевой службы. Вместо того, чтобы явным образом выписывать тысячи методов улавливания плиты котла, все они делают то же самое, я сделал все службы, расширяя BaseService, и в этом классе у меня есть метод OnMissingMethod, который ищет шаблоны getFooService() и setFooService (fooService) и делает это. .. –
... соответствующая работа установки, помещая их в переменную ["_ dependencies"] коллекции в цель. Недостатком является то, что при правильной настройке в любое время, когда я хочу ссылаться на инъецированную службу, которую я либо должен делать: переменные ["_ dependencies"]. FooService ИЛИ this.getFooService(). Проблема с этим.getFooService() заключается в том, что она несовместима с тем, как я вызываю другие методы в одном классе. Конечно, это не критическая проблема, но это не значит, что мне это нравится. –