2016-09-16 11 views
1

私は機能書いた:ファンクションとストアドプロシージャに同じ名前を付けることはできませんか?

function getArtists(where='', artistactive = true){ 
    //yadayada 
    return artists; 
} 

をし、それを含め、テンプレートでは、後、次の

<cfstoredproc datasource="#request.dsn#" procedure="GetArtists"> 
    <cfprocresult name="GetArtists"> 
</cfstoredproc> 

これはエラーを生成します。

Routines cannot be declared more than once. The routine getArtists has been declared twice in different templates

オクラホマので、質問1:ColdFusionでは、関数とストアドプロシージャは両方とも 'ルーチン'であり、2回宣言できないと考えていますか?

私の次のことは、関数テンプレートの前に、のストアドプロシージャを含めることでした。これは問題ありません。

質問2:何が得られますか?

答えて

5

エラーと思われるでしょう。あなたのコードをテストする際には、関数を宣言して同じ名前のストアドプロシージャを呼び出すときにエラーは発生しません。 <cfdump var="#variables#"> I を使用して変数スコープをダンプすると、関数が結果セットによって上書きされているため、結果セット(関数ではない)を参照してください。関数を宣言して上書きした後に関数を呼び出そうとすると、"Incorrect entity type for being a function"がエラーになります。

CFコンパイラがコードを実行し、UDFとコンポーネントを先にコンパイルすることを覚えておいてください。実行時にはコンパイルされません。参照しているエラーは、実行時ではなくコンパイル時に発生します。このため、UDFルーチンが実際には複数回含まれている可能性が高いと思います。一番下のデバッグ情報を見て、そのファイルを検索し、そうであるかどうかを確認するか、カスタムタグ呼び出しやファイルが倍増する他の方法を調べます。

アドバイス:原則として、UDFは独自のスペースで宣言する必要があります(onRequest()はそのための良い場所です)。この種のことから保護する必要があります。私はlib.function1()、lib.function2()のように "lib"のような変数を使い、関数(Javaのようなオブジェクトのメンバ)を格納します。あなたがそれをやっていることは、予測不可能につながります。その最後はちょうど私の意見です - 助けようとしています。 :)

+1

*はコンパイル時に発生します*はい、およびその理由は、インクルードが* cfstoredprocの後に*呼び出されたときにのみエラーが発生することに関連しています。あなたが言ったように、関数は 'variables'スコープにも格納されていますので、スコープが同じ名前の変数が既に存在することをCFが最初に確認していると推測しています。 – Leigh

+0

php guy、 '変数に格納されている'関数には使用されていません... lib.functionを実行するときに宣言するものは何ですか?あるいはlib.functionのような関数の名前をつけて、それを呼び出すのですか?結果= lib.function(somevar); –

+0

@DougCassidy関数ポインタを保持する変数は、CFMLで多少の機能プログラミングを行うのに非常に便利です。 JavaScriptと同様、ColdFusion CFCやCFMの変数であるグローバルスコープを「汚染」しないように注意する必要があります。 –

関連する問題