Как вызвать функцию динамически, которая является частью экземпляра cfc, без использования Evaluate ()? - PullRequest
7 голосов
/ 17 сентября 2008

Например, я хочу иметь возможность программно вводить строку кода, подобную следующей, где имя функции динамически назначается без использования Evaluate (). Код ниже, конечно, не работает, но представляет то, что я хотел бы сделать.

application.obj[funcName](argumentCollection=params)

Единственный способ найти способ динамического вызова функции - использовать cfinvoke, но, насколько я могу судить, он создает на лету связанную функцию cfc / и не может использовать ранее созданный экземпляр cfc.

Спасибо

Ответы [ 4 ]

9 голосов
/ 17 сентября 2008

Согласно документации, вы можете сделать что-то вроде этого:

<!--- Create the component instance. --->
<cfobject component="tellTime2" name="tellTimeObj">
<!--- Invoke the methods. --->
<cfinvoke component="#tellTimeObj#" method="getLocalTime" returnvariable="localTime">
<cfinvoke component="#tellTimeObj#" method="getUTCTime" returnvariable="UTCTime">

Вы должны иметь возможность просто вызывать его с методом = "# myMethod #" для динамического вызова определенной функции.

4 голосов
/ 17 сентября 2008

Вы можете использовать cfinvoke. Вам не нужно указывать компонент.

<cfinvoke method="application.#funcName#" argumentCollection="#params#">
1 голос
/ 18 октября 2011

В CFML функции являются первоклассными членами языка. Это позволяет нам передавать их как переменную. В следующем примере я скопирую функцию с именем 'foobar' и переименую ее в $ fn внутри того же объекта. Тогда мы можем просто вызвать $ fn ().

funcName = 'foobar';    
application.obj.$fn = application.obj[funcName];
application.obj.$fn(argumentCollection=arguments);

Контекст функции важен, особенно если он ссылается на какие-либо значения в области «переменные» или «это» объекта. Примечание: это не потокобезопасно для экземпляров CFC в общих областях!

Самый быстрый способ - использовать рекомендацию Бена Доума. Я просто хотел быть тщательным.

1 голос
/ 18 октября 2011

Вы также можете сделать что-то очень похожее на то, что вы хотели использовать. Вы можете получить доступ к методу внутри объекта, используя синтаксис, который вы использовали, вы просто не можете вызвать его одновременно. Однако, если вы назначите его временной переменной, вы можете вызвать его

<!--- get the component (has methods 'sayHi' and a method 'sayHello') --->
<cfset myObj = createObject("component", "test_object")>

<!--- set the function that we want dynamically then call it (it's a two step process) --->
<cfset func = "sayHi">
<cfset funcInstance = myObj[func]>
<cfoutput>#funcInstance("Dave")#</cfoutput>

<cfset func = "sayHello">
<cfset funcInstance = myObj[func]>
<cfoutput>#funcInstance("Dave")#</cfoutput>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...