Frage

Dies ist eines der größten Hindernisse gewesen, neue Leute Coldfusion in der Lehre.

Wenn verwenden # mehrdeutig besten ist. Da sie mit nicht schafft oft ein Problem scheint es, dass die meisten Menschen tendieren zu mit ihnen zu viel.

Also, was sind die Grundregeln?

War es hilfreich?

Lösung

Ich denke, dass es leichter sein kann zu sagen, wo NICHT # zu verwenden. Der einzige Ort ist in cfif Aussagen und CFSET Anweisungen, bei denen Sie keine Variable verwenden eine Zeichenfolge in Anführungszeichen zu bauen. Sie müssten das Zeichen # in fast allen anderen Fällen verwenden.

Beispiel, wo Sie wollen es nicht 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="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"/>

EDIT:

Eine oddball kleine Sache, die ich habe gerade bemerkt, dass im Widerspruch scheint, ist bedingte Schleifen erlauben die 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>

Andere Tipps

Hier ist, was Adobe hat darüber zu sagen:

Mit Nummernzeichen

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 komplexe Argumente 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, etc.

In allen diesen Fällen wird der Text zwischen den # Zeichen tut nicht haben die Name einer Variablen sein. In der Tat kann es jeden Ausdruck durch. Natürlich, für String-Interpolation, muss der Ausdruck auf einen einfachen Wert bewerten, sondern auch für Argument / Attribut in CFML vorbei, kann der Ausdruck auch zu jedem komplexen Wert bewerten.

Die #...# Syntax können Sie einen Ausdruck in einem Stringliteral einzubetten. Coldfusion ist leider ziemlich inkonsistent über das, was ein String ist und was ein Ausdruck. Jayson bot eine gute Liste der Beispiele wann zu verwenden ( oder nicht verwenden) # s.

Auf die Gefahr hin wie ein weiser Mann-zu klingen, als Faustregel lautet: Verwendung # around Variablen oder Ausdrücke nur, wenn nicht Dabei führt nicht das richtige Ergebnis . Oder:., Wenn Sie sie nicht benötigen, verwenden Sie sie nicht

Ich mag Jayson Antwort though.

Lassen Sie uns beginnen, indem vorausgesetzt, Sie sprechen nicht über cfoutput-Tags, verursachen dann die Antwort ist immer, an anderer Stelle in Ihrem Code, wenn Sie innerhalb von Anführungszeichen sind, dann # Symbole verwenden müssen, wenn es möglich ist, tatsächlich den Wert eingeben das wird verwendet werden ... also, wenn Sie in einem cfloop Tag Einstellung auf den ‚‘ Attribut sind, könnte man leicht 6 eingeben, aber wenn Sie eine Variable verwenden möchten, müssen Sie die # Symbole verwenden. Nun, wenn Sie in einem cfloop Tag Einstellung der Abfrageparameter sind, gibt es keine Möglichkeit Sie tatsächlich die Abfrage in diesem Attribut geben könnte, gibt es keine Möglichkeit, eine Abfrage zu geben, so werden keine # Symbole benötigt werden.

Ebenfalls in einem cfdump Tag können Sie statischen Text Dump, so dass, wenn Sie den Inhalt einer Variablen entleeren wollen, dann müssen Sie ein Symbol # verwenden. Dieses Problem ist in der Regel selbst korrigieren, aber ich fühle deinen Schmerz, Ihre Studenten wahrscheinlich frustriert, dass es keine „SIE IMMER NUTZEN“ oder „SIE NIEMALS“ -Ansatz ... leider ist dies nicht der Fall, ist die einzige Sache, die wahr ist, ist nur eine Möglichkeit, innerhalb von Anführungszeichen korrekt sein wird. Also, wenn es nicht sehen es hart und lange arbeiten und denken sich: „Kann ich diesen Wert eingeben, anstatt den Wert der Verwendung in dieser Variablen enthalten?“ Wenn die Antwort nein ist, dann werden die # Symbole nicht benötigt werden, sonst erhalten Sie Ihre Zeichen # foo auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top