2009-07-01 17 views
14

Questo è stato uno dei maggiori ostacoli nell'insegnamento alle nuove persone di ColdFusion.Quando dovrei usare # in ColdFusion?

Quando utilizzare # è ambiguo al meglio. Dal momento che usarli non crea spesso un problema, sembra che la maggior parte delle persone gravita a usarli troppo.

Quindi, quali sono le regole di base?

+1

Ci vuole un po 'di tempo per imparare le regole. Ma in realtà non hai bisogno di usarlo più di tanto, e ti consiglio di provare a capire quando hai effettivamente bisogno di usarlo, e non usarlo quando non ne hai bisogno. Vedi la mia risposta qui sotto. – yfeldblum

risposta

13

Penso che possa essere più facile dire dove non utilizzare #. L'unica posizione è nelle istruzioni cfif e nelle istruzioni cfset in cui non si utilizza una variabile per creare una stringa tra virgolette. Dovresti usare il segno # in quasi tutti gli altri casi.

esempio di dove non si ha intenzione di usarlo:

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

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

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

Esempi di dove si desidera utilizzare #:

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:

Una stravagante piccola cosa che appena notato che sembra incoerente sono i loop condizionali che permettono di usare il nome della variabile con e senza # segni.

<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

Anche CFLOOP non ne ha bisogno per la query param mentre CFDUMP lo fa. Non del tutto coerente. –

+1

CFLOOP si aspetta il/name/di una query. Quindi, se si utilizza # s nell'attributo di query di CFLOOP, è necessario valutare una stringa che è un nome di variabile che fa riferimento a un oggetto query. –

3

La sintassi #...# consente di incorporare un'espressione all'interno di una stringa letterale. Purtroppo, ColdFusion è piuttosto incoerente su cosa sia una stringa e cosa sia un'espressione. Jayson ha fornito una buona lista di examples di quando usare (o non usare) #s.

+3

La tendenza a sovrautilizzare # ... # deriva probabilmente dal fatto che molte persone hanno difficoltà a decidere cosa sia un'espressione e cosa sia una stringa letterale, e che la CF sia così indulgente sull'uso ridondante: funziona, e funziona anche, ma in entrambi i casi ## sono ridondanti. – Tomalak

7

Ecco quello che Adobe ha da dire in proposito:

Using number signs

+2

+1, ma è un po 'obsoleto. Ad esempio, dice che i segni di cancelletto possono contenere solo variabili o funzioni o variabili. Non è più vero. Qualsiasi espressione (come # 1 + 1 #) funziona almeno come da CF7. –

+0

Nevermind. Ho aggiornato il collegamento alla versione CF8 dello stesso documento. –

5

String interpolazione:

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

Auto-sfuggito interpolazione stringa 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 ---> 

Passaggio di argomenti complessi/attributi 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 ---> 

Passando bozzetto argomenti LEX richiede # firma solo in CFML, non in CFScript. Inoltre, è possibile passare qualsiasi tipo di valore: valori semplici, gli array, le strutture, cfcomponents, cffunctions, oggetti Java, gli oggetti COM, ecc

In tutti questi casi, il testo tra le # segni non hanno essere il nome di una variabile. In effetti, può da qualsiasi espressione. Ovviamente, per l'interpolazione delle stringhe, l'espressione deve valutare un valore semplice, ma per l'argomento/l'attributo che passa in CFML, l'espressione può valutare anche qualsiasi valore complesso.

1

A rischio di sembrare come un saggio-guy, una regola generale è: uso # around variabili o espressioni solo quando non così facendo non produce il risultato corretto. Oppure: se non ne hai bisogno, non usarli.

Mi piace la risposta di Jayson.

0

Iniziamo assumendo che non si stia parlando di tag cfoutput, perché la risposta è sempre, altrove nel codice, se ci si trova all'interno di virgolette, quindi è necessario utilizzare i simboli # se è possibile digitare effettivamente il valore che verrà usato ... quindi se sei in un tag cfloop che imposta l'attributo 'to', puoi facilmente digitare 6, ma se vuoi usare una variabile devi usare i simboli #. Ora se ci si trova in un tag cfloop che imposta il parametro query, non è possibile digitare la query in tale attributo, non è possibile digitare una query, quindi non sono necessari simboli #.

Allo stesso modo in un tag cfdump, è possibile scaricare il testo statico, quindi se si desidera scaricare il contenuto di una variabile, sarà necessario utilizzare un simbolo #. Questo problema è generalmente auto-correggente, ma sento il tuo dolore, i tuoi studenti sono probabilmente frustrati dal fatto che non esiste un approccio "SEMPRE UTILIZZARE" o "NON UTILIZZARLI" ... purtroppo non è questo il caso, l'unica cosa che è vero, è solo un modo all'interno di virgolette sarà corretto. Quindi, se non funziona, guardalo bene e a lungo e pensa a te stesso: "Potrei digitare quel valore invece di usare il valore contenuto in quella variabile?" Se la risposta è no, allora i simboli # non saranno necessari, altrimenti metti in pausa il tuo # personaggio.

Problemi correlati