我什么时候应该在ColdFusion中使用#?

时间:2009-07-01 11:18:42

标签: coldfusion railo cfml openbd

这是教授新人ColdFusion的最大障碍之一。

何时使用#充其量只是模棱两可。由于使用它们通常不会产生问题,似乎大多数人都倾向于过多地使用它们。

那么,基本规则是什么?

6 个答案:

答案 0 :(得分: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>

答案 1 :(得分:7)

以下是Adobe对此所说的话:

Using number signs

答案 2 :(得分:5)

字符串插值:

<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中的signes,而不是CFScript。此外,您可以传递任何类型的值:简单值,数组,结构,cfcomponents,cffunctions,java对象,com对象等。

在所有这些情况下,#符号之间的文字必须是变量的名称。事实上,它可以通过任何表达。当然,对于字符串插值,表达式必须求值为一个简单的值,但对于CFML中的参数/属性传递,表达式也可以求值为任何复杂值。

答案 3 :(得分:3)

#...#语法允许您在字符串文字中嵌入表达式。遗憾的是,ColdFusion与字符串和表达式的含义完全不一致。 Jayson提供了examples何时使用(或不使用)#s的良好列表。

答案 4 :(得分:1)

冒着听起来像个聪明人的风险,经验法则是:仅在这样做时不会产生正确的结果围绕变量或表达式使用# EM>。或者:如果您不需要它们,请不要使用它们。

我喜欢杰森的回答。

答案 5 :(得分:0)

让我们首先假设你不是在讨论cfoutput标签,因为如果你在引号内,答案总是在代码的其他地方,那么如果可以实际输入值,则需要使用#符号将要使用...所以如果你在cfloop标签中设置'to'属性,你可以轻松输入6,但如果你想使用变量,你需要使用#符号。现在,如果您在cfloop标记中设置查询参数,则无法将查询实际键入该属性,无法键入查询,因此不需要#符号。

同样在cfdump标记中,您可以转储静态文本,因此如果要转储变量的内容,则需要使用#符号。这个问题通常是自我纠正的,但是我觉得你的痛苦,你的学生可能会感到沮丧,因为没有“总是使用他们”或“从不使用他们”的方法......遗憾的是,事实并非如此,唯一的问题是是的,引号内只有一种方法是正确的。因此,如果它不工作,请坚持不懈地思考它并自己思考:“我可以输入该值而不是使用该变量中包含的值吗?”如果答案为否,那么将不需要#符号,否则将打开你的#字符foo。