ColdFusion で # を使用する必要があるのはどのような場合ですか?
-
21-08-2019 - |
質問
これは、新しい人に ColdFusion を教える際の最大の障害の 1 つです。
# をいつ使用するかは、よく言っても曖昧です。これらを使用しても問題が発生することはほとんどないため、ほとんどの人はそれらを使いすぎることに惹かれているようです。
では、基本的なルールとは何でしょうか?
解決
# を使用しない場所を指定する方が簡単だと思います。唯一の場所は、変数を使用して引用符で囲まれた文字列を構築していない 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="e@example.com" from="e@example.com" 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"/>
編集:
矛盾しているように見える奇妙な点の 1 つは、条件ループでは # 記号の有無にかかわらず変数名を使用できることです。
<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>
他のヒント
ここでAdobeがそれについて言っているものです。
数記号の<を使用して/ P>
文字列補間ます:
<cfset name = "Danny" />
<cfset greeting = "Hello, #name#!" />
<!--- greeting is set to: "Hello, Danny!" --->
cfquery
で自動エスケープされた文字列補間ます:
<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 --->
複雑な引数を渡すことだけCFML、ないCFScriptで#
のシーニュが必要です。また、あなたは、値のいずれかの種類渡すことができます。単純な値、配列、構造体、cfcomponents、CF関数、Javaオブジェクト、COMオブジェクトなどを
すべてのこれらのケースでは、#
記号の間のテキストは、はは変数ののの名前である必要はありません。実際には、任意の式をすることによってすることができます。もちろん、文字列の補間のため、式は単純な値に評価される必要がありますが、CFMLに渡す引数/属性のため、式は同様に任意の複雑な値に評価することができる。
#...#
構文では、文字列リテラル内の式を埋め込むことができます。 ColdFusionには、文字列だと表現は何かについて、残念ながらかなり矛盾しています。ジェイソンは、どのような場合に使用するのこの例の良いリストを提供(または)#Sを使用しています。
賢い-男のように聞こえるのリスクで、親指のルールは次のとおりです。はときにのみの のではないそうすることが正しい結果が得られていない変数や式の周りに#を使用しますem>の。または:あなたがそれらを必要としない場合は、それらを使用しないでください。
。でも、私はジェイソンの答えが気に入らます。
そして、答えはあなたが引用符の内側にある場合、それは実際に値を入力することができます場合は#記号を使用する必要がある、あなたのコード内の他の場所で、常に引き起こし、あなたがするcfoutputタグについて話されていないと仮定してみましょうそれが使用されようとしている...ので、あなたは属性「に」を設定cfloopタグである場合、あなたは簡単に6を入力することができますが、あなたは#記号を使用する必要がある変数を使用したい場合。今、あなたは、クエリパラメータを設定cfloopタグであるならば、あなたが実際にその属性にクエリを入力することができる方法はありません、そこにクエリを入力する方法はありませんので、何の#記号は必要ありません。
同様にcfdumpタグで、あなたは、静的なテキストをダンプすることができますので、あなたは、変数の内容をダンプする場合は、#記号を使用する必要があります。この問題は、一般的に自己修正ですが、私はあなたの痛みを感じ、あなたの学生は何も「常にそれらを使用する」または「NEVERそれらを使用する」のアプローチが存在しないことをおそらく欲求不満です...悲しいことに、これは、その唯一のケースではありません真である、唯一の方法は引用符の内側には、正しいことを行っているです。それは見て動作していないのであれば、それは難しいと長いと自分自身に思う:「私はその変数に含まれる値を使用するのではなく、その値を入力してもらえますか?」答えはノーである場合、#記号は必要ありません、そうでない場合にあなたの#文字fooのを取得します。