2009-07-01 12 views
14

Dies war eines der größten Hindernisse beim Unterrichten neuer Leute ColdFusion.Wann sollte ich # in ColdFusion verwenden?

Wann ist # am besten zweideutig? Da die Verwendung von ihnen nicht oft ein Problem verursacht, scheint es, dass die meisten Menschen dazu neigen, sie zu oft zu benutzen.

Also, was sind die Grundregeln?

+1

Es dauert ein wenig Zeit, um die Regeln zu lernen. Aber Sie müssen es nicht wirklich verwenden, und ich würde empfehlen, herauszufinden, wann Sie es wirklich brauchen, und es nicht verwenden, wenn Sie es nicht brauchen. Siehe meine Antwort unten. – yfeldblum

Antwort

13

Ich denke, dass es einfacher sein kann, wenn nicht zu sagen # zu verwenden. Die einzige Stelle ist in cfif-Anweisungen und cfset-Anweisungen, in denen Sie keine Variable verwenden, um eine Zeichenfolge in Anführungszeichen zu erstellen. In fast allen anderen Fällen müssen Sie das # -Zeichen verwenden.

Beispiel, wo man es nicht gehen zu verwenden:

<cfset value1 = 5> 
<cfset value2 = value1/> 

<cfif value1 EQ value2> 
    Yay!!! 
</cfif> 

<cfset value2 = "Four plus one is " & value1/> 

Beispiele, wo Sie # verwenden:

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="[email protected]" from="[email protected]" 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"/> 

EDIT:

Ein oddball wenig, was ich gerade bemerkt, dass scheint inkonsistent ist bedingte Schleifen erlauben den Variablennamen mit und ohne # Zeichen verwendet werden.

<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> 
+0

CFLOOP benötigt es auch nicht für den Abfrageparameter, während CFDUMP dies tut. Nicht ganz konsistent. –

+1

CFLOOP erwartet den/name/einer Abfrage. Wenn Sie also #s im Abfrageattribut von CFLOOP verwenden, muss es in einer Zeichenfolge ausgewertet werden, bei der es sich um einen Variablennamen handelt, der auf ein Abfrageobjekt verweist. –

3

Mit der #...#-Syntax können Sie einen Ausdruck in ein Zeichenfolgenliteral einbetten. ColdFusion ist leider ziemlich inkonsequent darüber, was eine Zeichenfolge ist und was ein Ausdruck ist. Jayson hat eine gute Liste von examples von wann zu verwenden (oder nicht verwendet) #s.

+3

Die Tendenz zur Überbenutzung von # ... # resultiert wahrscheinlich aus der Tatsache, dass viele Menschen Schwierigkeiten haben, zu entscheiden, was ein Ausdruck ist und was ein String-Literal ist und dass CF so redundante Verwendung verzeiht: funktioniert, und funktioniert auch, aber in beiden Fällen sind ## überflüssig. – Tomalak

7

Hier ist, was Adobe dazu zu sagen hat:

Using number signs

+2

+1, aber das ist ein wenig veraltet. Zum Beispiel heißt es, Pfundzeichen können nur Variablen oder Funktionen oder Variablen enthalten. Das ist nicht mehr wahr. Jeder Ausdruck (zB # 1 + 1 #) funktioniert mindestens ab CF7. –

+0

Vergesst nicht. Ich habe den Link zur CF8-Version des gleichen Dokuments aktualisiert. –

5

String Interpolation:

<cfset name = "Danny" /> 
<cfset greeting = "Hello, #name#!" /> 
<!--- greeting is set to: "Hello, Danny!" ---> 

Auto-maskierte String Interpolation in 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 ---> 

Passing komplexe Argumente/Attribute in 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 ---> 

Passing comp Lex Argumenten erfordert # Signes nur in CFML, nicht CFScript. Darüber hinaus können Sie jede Art von Wert übergeben: einfache Werte, Arrays, Strukturen, cfcomponents, cffunctions, Java-Objekte, com Objekte usw.

In all diesen Fällen, den Text zwischen den # Zeichen hat nicht haben der Name einer Variablen sein. In der Tat kann es durch jeden Ausdruck. Natürlich muss der Ausdruck für die Zeichenfolgeninterpolation einen einfachen Wert ergeben, aber für das Argument/die Attributübergabe in CFML kann der Ausdruck auch einen beliebigen komplexen Wert auswerten.

1

Auf der Gefahr wie ein weiser-Typ klingt, eine Faustregel: Verwendung # around Variablen oder nur Ausdrücke, wenn nicht so das richtige Ergebnis liefert nicht zu tun. Oder: Wenn Sie sie nicht brauchen, benutzen Sie sie nicht.

Ich mag Jaysons Antwort obwohl.

0

Beginnen wir mit der Annahme, dass Sie nicht über cfoutput-Tags sprechen, denn dann ist die Antwort immer woanders in Ihrem Code, wenn Sie innerhalb von Anführungszeichen sind, müssen # Symbole verwenden, wenn es möglich ist, das tatsächlich einzugeben Wert, der verwendet wird ... Wenn Sie also in einem cfloop-Tag das 'to' -Attribut setzen, können Sie einfach 6 eingeben, aber wenn Sie eine Variable verwenden möchten, müssen Sie die # -Symbole verwenden. Wenn Sie jetzt in einem cfloop-Tag den Abfrageparameter setzen, gibt es keine Möglichkeit, die Abfrage tatsächlich in dieses Attribut einzugeben. Es gibt keine Möglichkeit, eine Abfrage einzugeben, sodass keine # -Symbole benötigt werden.

Gleichermaßen können Sie in einem cfdump-Tag statischen Text ausgeben. Wenn Sie also den Inhalt einer Variablen ausgeben möchten, müssen Sie ein # -Zeichen verwenden. Dieses Problem ist im Allgemeinen selbstkorrigierend, aber ich fühle Ihren Schmerz, Ihre Schüler sind wahrscheinlich frustriert, dass es keine "IMMER GEBRAUCH" oder "NIEMALS BENUTZEN" -Ansatz gibt ... leider ist dies nicht der Fall, das einzige, was ist wahr, ist nur ein Weg innerhalb von Anführungszeichen korrekt. Also, wenn es nicht funktioniert, schau es dir hart und lang an und denke dir: "Könnte ich diesen Wert austippen, anstatt den Wert zu verwenden, der in dieser Variable enthalten ist?" Wenn die Antwort nein ist, dann werden die Symbole # nicht benötigt, andernfalls wird Ihr # Zeichen foo aktiviert.

Verwandte Themen