这是教授新人 ColdFusion 的最大障碍之一。
何时使用 # 充其量是模棱两可的。由于使用它们通常不会产生问题,因此大多数人似乎倾向于过度使用它们。
那么,基本规则是什么?
这是教授新人 ColdFusion 的最大障碍之一。
何时使用 # 充其量是模棱两可的。由于使用它们通常不会产生问题,因此大多数人似乎倾向于过度使用它们。
那么,基本规则是什么?
我认为说在哪里不使用# 可能更容易。唯一的地方是在 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"/>
编辑:
我刚刚注意到的一件奇怪的小事似乎不一致,条件循环允许变量名在有和没有 # 符号的情况下使用。
<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 对此的评价:
字符串插值:
<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、cffunctions、java 对象、com 对象等。
#
在所有这些情况下,符号之间的文本不必是变量的名称。事实上,它可以用任何表达方式。当然,对于字符串插值,表达式必须计算为一个简单值,但对于在 CFML 中传递的参数/属性,表达式也可以计算为任何复杂值。
该#...#
语法允许您在字符串文字中嵌入表达式。不幸的是,ColdFusion 对于什么是字符串和什么是表达式非常不一致。Jayson 提供了一个很好的示例列表,说明何时使用(或不使用)#s。
冒着听起来像个聪明人的风险,一个经验法则是:只有在不这样做不会产生正确结果时才在变量或表达式周围使用#。或者:如果您不需要它们,请不要使用它们。
不过,我喜欢杰森的回答。
让我们首先假设您不是在谈论 cfoutput 标签,因为答案总是在代码的其他地方,如果您在引号内,则需要使用 # 符号,如果可以实际键入要输入的值要使用...因此,如果您在 cfloop 标记中设置“to”属性,则可以轻松键入 6,但如果要使用变量,则需要使用 # 符号。现在,如果您在设置查询参数的 cfloop 标记中,则无法在该属性中实际键入查询,无法键入查询,因此不需要 # 符号。
同样在 cfdump 标记中,您可以转储静态文本,因此如果您想转储变量的内容,则需要使用 # 符号。这个问题通常是自我纠正的,但我感觉到你的痛苦,你的学生可能对没有“总是使用它们”或“从不使用它们”的方法感到沮丧……遗憾的是,事实并非如此,唯一的事情是是真的,只有引号内的一种方式是正确的。因此,如果它不起作用,请仔细观察它并思考自己:“我可以输入该值而不是使用该变量中包含的值吗?” 如果答案是否定的,则不需要 # 符号,否则请打开 # 字符 foo。