这一直是最大的障碍之一,在教学新人们的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 # SIGNES。此外,可以通过任何种类的值:简单值,数组,结构cfcomponents,cffunctions,Java对象,COM对象等

在所有这些情况下,#标志之间的文本确实必须是可变的的名。事实上,它可以通过任何表达。当然,对于串内插,则表达式必须计算一个简单的值,但对于参数/属性传递CFML,表达可以评估任何复数值为好。

#...#语法允许一个字符串中嵌入的表达式。 ColdFusion的是什么是一个字符串,什么是表达遗憾的是相当不一致。杰森提供的例子很好的列表的时候使用(或不使用)#秒。

目前听起来像一个明智的,人的风险,经验法则是:使用#围绕变量或表达式,只有当不可以这样做不会产生正确的结果。或者:如果你不需要他们,不使用它们

我喜欢杰森的回答虽然。

让我们假设你是不是在谈论CFOUTPUT标签开始,因为那样的回答总是,其他地方在你的代码,如果你是引号里面,那么就需要使用#符号,如果有可能实际输入值这是将要使用......所以,如果你是在一个CFLOOP标签设置“to”属性,你可以很容易地键入6,但如果你想使用一个变量,你需要使用#符号。现在,如果你是在一个CFLOOP标签设置的查询参数,也没有办法,你实际上可以输入查询到该属性,没有办法输入查询,因此不需要#符号。

同样,在一个cfdump标签,你可以转储静态文本,所以如果你想转储变量的内容,那么你就需要使用#符号。这个问题通常是自我纠正的,但我觉得你的痛苦,你的学生可能感到失望,没有“始终使用他们”或“不使用它们”的方法。不幸的是,这是不是这种情况,唯一的事情,是真实的,是内部引号的一种方式将是正确的。所以,如果不是在工作的样子很难与长和认为自己:“难道我键入值了,而不是使用包含在该变量的值吗?”如果答案是否定的,那么将不再需要在#符号,否则让你的#字符富。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top