2009-07-01 13 views
14

これは、新しい人物ColdFusionを教える上で最も大きな障害の1つです。ColdFusionで#を使用する時期はいつですか?

#を使用する場合は、せいぜいあいまいです。それらを使用することはしばしば問題を引き起こすことはないので、ほとんどの人はそれらをあまりにも多く使用することに引っ掛かるようです。

だから、基本的なルールは何ですか?

+1

ルールを学ぶのに少し時間がかかります。しかし実際にはそれほど多くを使用する必要はありません。実際に使用する必要があるときを把握し、必要がないときには使用しないことをお勧めします。下の私の答えを見てください。 – yfeldblum

答えて

13

私は#を使用しない場所を言うことが容易かもしれないと思います。唯一の場所は、cfifステートメントとcfsetステートメントで、引用符で囲んだ文字列を作成するために変数を使用していない場所です。ほとんどの場合、#記号を使用する必要があります。あなたはそれを使用するつもりはないところの

例:あなたは#を使用する場所の

<cfset value1 = 5> 
<cfset value2 = value1/> 

<cfif value1 EQ value2> 
    Yay!!! 
</cfif> 

<cfset value2 = "Four plus one is " & value1/> 

例:

in a cfset where the variable is surrounded by quotes 
<cfset value1 = 5> 
<cfset value2 = "Four plus one is #value1#"/> 

the bodies of cfoutput, cfmail, and cffunction (output="yes") tags 
<cfoutput>#value2#</cfoutput> 
<cfmail to="[email protected]" from="[email protected]" subject="x">#value2#</cfmail> 
<cffunction name="func" output="yes">#value2#</cffunction>  

in an attribute value of any coldfusion tag 
<cfset dsn = "myDB"/> 
<cfquery name="qryUsers" datasource="#dsn#"> 

<cfset value1 = 5> 
<cfset value2 = 10/> 
<cfloop from="#value1#" to="#value2#" index="i"> 

<cfqueryparam value="#value1#" cfsqltype="cf_sql_integer"/> 

EDIT:

一つ変わり者小さなことI矛盾しているように見えているのは、条件付きループによって変数名が#記号の有無にかかわらず使用できるということだけです。

<cfset value1 = 5> 

<cfloop condition = "value1 LTE 10"> 
    <cfoutput>#value1#</cfoutput><br> 
    <cfset value1 += 1> 
</cfloop> 

<cfset value1 = 5> 

<cfloop condition = "#value1# LTE 10"> 
    <cfoutput>#value1#</cfoutput><br> 
    <cfset value1 += 1> 
</cfloop> 
+0

CFLUPは、CFDUMPが行うのに対し、クエリのパラメータとしてCFLOOPも必要ありません。全く一貫していない。 –

+1

CFLOOPは、クエリの/ name /が必要です。したがって、CFLOOPのクエリ属性で#を使用する場合は、クエリオブジェクトを参照する変数名である文字列に評価する必要があります。 –

3

#...#構文を使用すると、文字列リテラル内に式を埋め込むことができます。残念ながら、ColdFusionでは、文字列と式が何であるかについてかなり矛盾しています。ジェイソンは、いつでも#を使用する(または使用しない)examplesの良いリストを提供しました。ここで

+3

多くの人が式が何で、文字列リテラルなのかを判断するのが難しく、CFは重複使用を許しているという事実から、おそらく#が動作し、も動作しますが、どちらの場合も##は冗長です。 – Tomalak

7

は、Adobeがそれについて言っているものです。

Using number signs

+2

+1ですが、それは少し古くなっています。たとえば、ポンド記号には変数、関数、または変数しか含めることができません。それはもはや真実ではない。任意の式(#1 + 1#など)は少なくともCF7として動作します。 –

+0

Nevermind。私は同じ文書のCF8版へのリンクを更新しました。 –

5

文字列の補間:cfquery

<cfset name = "Danny" /> 
<cfset greeting = "Hello, #name#!" /> 
<!--- greeting is set to: "Hello, Danny!" ---> 

自動エスケープされた文字列の補間:

<cfset username = "dannyo'doule" ?> 
<cfquery ...> 
    select u.[ID] 
    from [User] u 
    where u.[Username] = '#username#' 
</cfquery> 
<!--- the query is sent to the server (auto-escaped) as: ---> 
<!--- select u.[ID] from [User] u where u.[Username] = 'dannyo''doule' ---> 
<!--- note that the single-quote in the username has been escaped ---> 
<!--- by cfquery before being sent to the database server ---> 

複雑な引数を渡す/ CFMLの属性:

<cfset p = StructNew() /> 
<cfset p.firstName = "Danny" /> 
<cfset p.lastName = "Robinson" /> 
<cfmodule template="modules/view/person.cfm" person="#p#"> 
<!--- the variable Attributes.person will be ---> 
<!--- available in modules/view/person.cfm ---> 

コンプを渡しますlex引数には、#の署名はCFScriptではなくCFMLでのみ必要です。単純な値、配列、構造体、cfcomponents、CF関数、Javaオブジェクト、COMオブジェクトなどのすべてのこれらのケースでは

ないが持っているん#兆候間のテキスト:また、あなたは、値のいずれかの種類を渡すことができます変数の名前がになります。実際、どのような表現でも可能です。もちろん、文字列補間の場合、式は単純な値に評価される必要がありますが、CFMLで渡される引数/属性の場合、式は任意の複素数値に評価されることがあります。 はそうではない変数や式の周り使用#場合にのみ、正しい結果が得られない:賢い-男、親指のルールのように聞こえるの危険に

1

です。または、必要がない場合は使用しないでください。

私はジェイソンの答えが好きです。

0

cfoutputタグについて話していないと仮定することから始めましょう。答えは常に引用符で囲まれていれば答えが常にコードのどこかにありますので、実際にコードを入力することができる場合は#記号を使用する必要がありますあなたがcfloopタグで 'to'属性を設定している場合、6を簡単に入力できますが、変数を使用するには#記号を使用する必要があります。クエリーパラメータを設定するcfloopタグを使用している場合、実際にその属性にクエリーを入力する方法はありません。クエリーを入力する方法はないので、#記号は必要ありません。

同様に、cfdumpタグでは、静的テキストをダンプできます。そのため、変数の内容をダンプする場合は、#記号を使用する必要があります。この問題は、一般的に自己修正ですが、私はあなたの苦痛を感じます、あなたの学生はおそらく、 "常にそれらを使用する"または "決して使用しない"というアプローチには不満を抱いています...悲しいことに、引用符で囲まれた唯一の方法は正しいと思われます。だから、もしそれが働かないならば、それを長く見て自分自身に考えてください: "その変数に含まれている値を使う代わりに、その値をタイプすることができますか?"答えがノーなら、#記号は必要ではなく、そうでなければ#文字fooをつけてください。

関連する問題