7

たとえば、関数名が Evaluate() を使用せずに動的に割り当てられる次のようなコード行をプログラムでヒットできるようにしたいと考えています。もちろん、以下のコードは機能しませんが、私がやりたいことを表しています。

application.obj[funcName](argumentCollection=params)

関数を動的に呼び出す唯一の方法は cfinvoke を使用することですが、関連する cfc/関数をオンザフライでインスタンス化し、以前にインスタンス化した cfc を使用できないことがわかる限りです。

ありがとう

4

4 に答える 4

9

ドキュメントによると、次のようなことができます。

<!--- 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">

method="#myMethod#" を使用して呼び出すだけで、特定の関数を動的に呼び出すことができるはずです。

于 2008-09-17T16:03:10.133 に答える
4

cfinvoke を使用できます。コンポーネントを指定する必要はありません。

<cfinvoke method="application.#funcName#" argumentCollection="#params#">
于 2008-09-17T16:03:37.513 に答える
1

CFML では、関数は言語の第一級メンバーです。これにより、それらを変数のように渡すことができます。次の例では、「foobar」という名前の関数をコピーし、同じオブジェクト内で「$fn」という名前に変更します。次に、単純に $fn() を呼び出すことができます。

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

関数のコンテキストは、オブジェクトの「変数」または「この」スコープ内の値を参照する場合は特に重要です。注: これは、共有スコープ内の CFC インスタンスに対してスレッドセーフではありません!

最速の方法は、Ben Doom の推奨事項を使用することです。徹底したかっただけです。

于 2011-10-18T10:41:04.237 に答える
1

また、使用したい方法と非常によく似たものを実行することもできます。使用した構文を使用してオブジェクト内のメソッドにアクセスできますが、同時に呼び出すことはできません。ただし、一時変数に割り当てると、それを呼び出すことができます

<!--- 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>
于 2011-10-18T03:42:55.370 に答える