2011-08-26 9 views
5

私は登録ページ上のいくつかの情報をループ機能を書いています。ループ内では、配列に基づいて関数を呼び出そうとしています。私は、私は、関数名の一部として変数を組み込むようにしようとしているので、実際に、適切な機能を呼び出しているとの問題を抱えています。 validate_email、validate_uname、validate_pass:はどうすればColdFusionでの関数名の一部として変数の名前を呼ぶことができますか?

<cfscript> 
fields = arraynew(1); 
fields[1] = 'r_email'; 
fields[2] = 'r_uname'; 
fields[3] = 'r_pass'; 

for(i = 1; i lte arraylen(fields); i = i + 1) 
{ 
    func = fields[i].split('r_'); 
    func = 'validate_#func[2]#(#fields[i]#)'; 
} 
</cfscript> 

だから、私は3つの機能を持っている:

は、ここに私のコードです。 writeoutput()をスローして関数の結果を出力しようとすると、関数は動作しません。

<cfscript> 
fields = arraynew(1); 
fields[1] = 'r_email'; 
fields[2] = 'r_uname'; 
fields[3] = 'r_pass'; 

for(i = 1; i lte arraylen(fields); i = i + 1) 
{ 
    func = fields[i].split('r_'); 
    func = 'validate_#func[2]#(#fields[i]#)'; 
    writeoutput('#func#'); 
} 
</cfscript> 

今、私はあなたがのWriteOutput()を使用している、とあなたが関数を呼び出しているとき、どちらかの端にハッシュ記号が必要であることを理解して:

は、ここでそのコードです。それでは、私はこのようにそれを書きましょう:

writeoutput('#validate_#func[2]#(#fields[i]#)#'); 

第2のハッシュ記号は、関数呼び出しを相殺するので、それは動作しません。この関数は、最終的に(電子メールの例を)どのように見えるべきかです:

writeoutput('#validate_email('[email protected]')#'); 

はどのようにして、適切な変数名でのメール '(#validate_emailを...)置き換えることができ、かつ、まだ機能の仕事を持っていますか?私はこれを理解できるようにしたいと思う!

答えて

10

関数を使用すると、配列、構造体、およびスコープ用ブラケット表記法を使用することができ、同じようになるよう、動的変数名(したがって動的関数名)例えば

にアクセスするためにこれを使用することができ、あまりにも変数です。

<cfloop index="Field" list="email,uname,pass"> 
    <cfset Result = Variables['validate_'&Field](Variables['r_'&Field]) /> 
    ... 
</cfloop> 

まあ...そうではありません。 (それはRailoのように、他のCFMLエンジンでないが)のAdobe ColdFusionでのバグのため、それはそのように動作しない、とあなたはこのように、2行に分割する必要があります(この

<cfloop index="Field" list="email,uname,pass"> 
    <cfset TmpFunc = Variables['validate_'&Field] /> 
    <cfset Result = TmpFunc(Variables['r_'&Field]) /> 
    ... 
</cfloop> 

関数とフィールドの両方がvariablesスコープにあると仮定します。スコープが参照されていない場合は参照してください。

このメソッドは、関数が状態のオブジェクトにあった場合に問題があります。それらの変数への参照を失います。 CF10で

invoke機能があります。以前のバージョンのCFでは、cfinvokeタグを使用する必要があります。


(注意点として、CF10は時々便利で来るブラケット表記で関数の結果を参照の逆能力、すなわちdoSomething()[key]を追加しました。)

+0

これはCFのバグではありません.Peter:これは決して実装されていません。コメントをそのような効果に修正したいかもしれません。さもなければスポット・オンの答え。 –

+3

'Variables.Bob()'と 'Variables ['Bob']()'の間に違いはありませんが、2番目の変数はエラーを投げます。私はそれを実装されていない機能ではなく、ブラケット表記のバグと呼びます。 –

+0

ありがとうございます。私は両方の提案が素晴らしい作品を受け取った。私はCFには新しいので、私は群衆と一緒に行くし、他の人よりむしろこれを使用しています。もう一つはもう少し簡単ですが、それに問題がある場合、私はそれに取り掛かりたくありません!再度、感謝します! –

1

ピーターの答えは上のスポットです(除きます私がコメントした "バグ"参照)。明らかに - - 1が好きな任意の動的な値をとる1は、CFScriptのブロックの途中でない場合はもう一つの選択肢は、< cfinvokeの>はそのMETHOD属性値として文字列を受け取り、それができることです。

これはあなたの特定の状況のた​​めにそうUCHヘルプはありませんが、それは、心に留めて便利です。

私はevaluate()アプローチを使用しません。

0

評価版はColdFusion 6.1でJavaに移行する前に評価すると常に評価されていましたが、6.1では式を評価してから、コードとしてインクルードされた文字列を使用してインラインPageContextを作成しています。

非常に滑らかで、非常に演技的です。

だから、あなたの目的を達成するための最も簡単なと最も簡単な方法は次のとおりです。

<cfset result = validate_username(variables.r_username) /> 

<cfset result = evaluate("validate_#Field#(variables.r_#Field#)") /> 

ですから、「ユーザー名」という名前のフィールドを持っていると仮定すると、これは以下のメソッド呼び出しの同等になります

と返されるものは、variables.resultに割り当てられます。

テストでは、実際にはメソッドを新しい名前に再割り当てするブラケット表記法よりも優れています。私は現時点では統計情報を持っていませんが、インクルードは変数代入より高速です(そして、解析/コンパイルの別の段階で発生します)。この問題へ

+0

Adamのevaluate()に対する忠告については、愚かではなく、ユーザーが提供する値を評価するために(例えば、ユーザーが本質的にコードを入力できるようにするなど)、このメソッドの使用を避ける理由はありません。 パフォーマンスやセキュリティの問題が残りません。 – jrypkahauer

0

もう一つのアプローチは、次のようなUDFを使用することです:

<cffunction name="callMethod"> 
     <cfargument name="methodName" type="string" required="true" /> 
     <cfargument name="methodArgs" type="struct" default="#{}#" /> 
     <cfset var rslt = 0 /> 
     <cfinvoke method="#arguments.methodName#" argumentcollection="#arguments.methodArgs#" returnvariable="rslt" /> 
     <!--- account for the possibility that the method call wiped out the rslt variable ---> 
     <cfif structKeyExists(local,'rslt')> 
      <cfreturn rslt /> 
     </cfif> 
    </cffunction> 

あなたがする必要がある場合は、この可能性:

<cfinclude template="invokerudf.cfm" /> 
    <cfscript>...</cfscript> 

またはタグとトスでそれをラップをそれは、CFCへ:

<cfset retval = createObject("methodinvoker").callMethod(methodName,methodArgs) /> 

ちょうど今そこにさまざまなアイデアを投げこれを実現するために多くの、多くの方法があります...。

関連する問題