什么时候不在ColdFusion中使用hash#符号?

时间:2014-02-04 21:48:28

标签: coldfusion cfml

我在我的应用程序中的每个动态值周围使用#符号,在此处发布我的一些代码以获取帮助后,我被告知在许多地方无需使用#例如<cfif>陈述。

所以我已经开始删除#符号,直到我意识到我已经破坏了我的应用程序,因为我从value=""标记的<cfprocparam>属性中删除了#符号。

我很困惑:

  1. 为什么使用#符号是某些地方而不是其他地方(不使用它的好处是什么?)
  2. 为什么<cfif><cfargument>代码中不需要它们,<cfprocparam>代码中是否突然需要它们?
  3. 由于缺乏一致性,首先围绕每个动态值包围哈希值是不是更好?

3 个答案:

答案 0 :(得分:6)

没有不一致(或者很少:你引用的不一致是不一致的),只是你不理解规则(这是非常基本的)。这些都在文档中:“Using number signs

简而言之,在CFML声明中,所有元素都被视为CFML,因此不需要特别标记它们。 EG:

<cfset myVar = someFunction(anArgument)>

myVarsomeFunctionanArgument除了CFML结构之外没有任何歧义,所以不需要这样做:

<cfset myVar = #someFunction(anArgument)#>

有些人倾向于这样做。

在文本的中间或字符串中,对于什么是文本以及什么是CFML存在歧义,因此需要使用井号来标记它们。 EG:

<cfset myVar = "The time is #now()#">

我们必须在那里使用pound-signs来消除now()作为CFML语句的歧义,这不仅仅是字符串的一部分,例如:

<cfset myVar = "CFML has a function now() which returns the current timestamp">

同样:

<cfquery>
    SELECT col1
    FROM table2
    WHERE col2 = #someValue#
</cfquery>

没有办法知道someValue是一个变量而没有标记它。

基本上就是这样。这并不复杂。

答案 1 :(得分:2)

规则1:如果你在引号内,那么你正在推一个字符串。如果你想要替换,你使用#name#

规则2:如果您在<cfoutput>内,则表示您正在生成一个字符串。

虽然可以写

<cfif "#name#" EQ "bob">Hi Bob</cfif>

写起来更容易

<cfif name EQ "bob">Hi Bob</cfif>

规则3:我认为<cfoutput query="qryData">有点不对,我已经写了很多,我没有多想。

答案 2 :(得分:1)

仅当您需要评估该变量的内容时,才需要在变量周围使用#符号。例如,当您需要将该变量放在视图中时。

在cfset或cfif中不需要它们,因为变量的内容在Set或比较中使用。

您不应该在cfargument标记中使用变量的值。但是,您可以将变量作为参数传递,而无需先对其进行评估,例如。 myFunction(myarg = myVariable)

Cfprocparam你需要传递值。您可能会混淆传递变量和值的方式。

Value =“myVar”将传递“myVar”作为值,其中value =“#myVar#”将评估myVar并将其内容传递给value。 value = myVar会将myVar传递给value。

您提供的示例中没有真正的不一致。这并不是说ColdFusion中没有一些不一致的地方。 ;)

不要散列一切。它很混乱,意味着你在你编写的所有代码中添加一个评估步骤。