何时应该在ColdFusion中使用#号?

15

这一直是教新手ColdFusion的最大障碍之一。

何时使用 # 最好不要模棱两可。由于使用它们通常不会引起问题,因此大多数人似乎倾向于过度使用它们。

那么,基本规则是什么?


1
学习规则需要一点时间。但实际上你并不需要经常使用它,我建议尝试弄清楚何时需要使用它,在不需要使用时不要使用它。请参见下面的答案。 - yfeldblum
6个回答

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="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>

CFLOOP不需要查询参数,而CFDUMP需要。并不完全一致。 - Tom Hubbard
1
CFLOOP期望查询的名称。因此,如果您在CFLOOP的查询属性中使用#s,它必须评估为一个字符串,该字符串是引用查询对象的变量名称。 - Patrick McElhaney

7

2
+1,但这有点过时了。例如,它说井号只能包含变量或函数或变量。这已经不再是真的了。任何表达式(例如#1+1#)至少在CF7中都可以工作。 - Patrick McElhaney
没关系。我更新了同一文档的CF8版本链接。 - Patrick McElhaney

5

字符串插值:

<cfset name = "Danny" />
<cfset greeting = "Hello, #name#!" />
<!--- greeting is set to: "Hello, Danny!" --->
< p >在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。此外,您可以传递任何类型的值:简单值、数组、结构体、cf组件、cffunctions、java对象、com对象等。
在所有这些情况下,#符号之间的文本不必是变量的名称。实际上,它可以是任何表达式。当然,对于字符串插值,表达式必须求值为简单值,但对于CFML中的参数/属性传递,表达式也可以求值为任何复杂值。

3
< p > #...# 语法允许将表达式嵌入字符串文字中。不幸的是,ColdFusion对于什么是字符串和什么是表达式并不一致。Jayson提供了一个很好的例子,告诉你何时使用(或不使用)#。


3
过度使用 #...# 可能的原因是许多人难以确定什么是表达式,什么是字符串字面量,而且 ColdFusion 对于冗余使用非常宽容: <cfset x = #y#> 是可行的,<cfset x = "#y#"> 也是可行的,但在两种情况下都使用 ## 是多余的。 - Tomalak

1
冒昧地说,一个经验法则是:只有在不使用#时无法得到正确结果时,才在变量或表达式周围使用它们。或者说:如果你不需要它们,就不要使用它们。
尽管如此,我喜欢Jayson的回答。

1
也许不是对所问问题的确切回答,但我喜欢这个回答的精神。禁用“无处不用井号”的心态(由旧文档培养)迫使开发人员意识到它们实际上并不经常需要使用! - SOS

0

首先,假设您不是在谈论cfoutput标记,因为那么答案总是在代码的其他地方。如果您在引号内部,则需要使用#符号(如果可能)来键入要使用的值...所以,如果您在cfloop标记中设置“to”属性,则可以轻松键入6,但如果要使用变量,则需要使用#符号。现在,如果您在cfloop标记中设置查询参数,则无法实际键入查询到该属性中,无法键入查询,因此不需要使用#符号。

同样地,在cfdump标记中,您可以转储静态文本,因此如果要转储变量的内容,则需要使用#符号。这个问题通常是自我纠正的,但我感到您的痛苦,您的学生可能会感到沮丧,因为没有“始终使用它们”或“永远不使用它们”的方法...可悲的是这不是情况,唯一正确的事情是引号内只有一种方式。所以,如果它不起作用,请仔细思考并长时间查看它,并想:“我能否键入该值而不是使用该变量中包含的值?”如果答案是否定的,则不需要使用#符号,否则请使用#字符foo。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接