Question

Cela a été l'un des plus grands obstacles dans l'enseignement de nouvelles personnes ColdFusion.

Quand utiliser # est ambigu au mieux. Depuis leur utilisation ne crée pas souvent un problème, il semble que la plupart des gens gravitent autour de les utiliser trop.

Alors, quelles sont les règles de base?

Était-ce utile?

La solution

Je pense qu'il peut être plus facile de dire où ne pas utiliser #. Le seul endroit est dans les déclarations de cfif et cfset déclarations où vous n'utilisez pas une variable pour construire une chaîne entre guillemets. Vous devez utiliser le signe # dans presque tous les autres cas.

Exemple d'où vous n'allez utiliser:

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

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

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

Des exemples de où vous utiliserez #:

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:

Une chose hurluberlu peu que je viens de remarquer que semble est des boucles conditionnelles incompatibles permettent le nom de la variable à utiliser avec et sans signes #.

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

Autres conseils

Voici ce que Adobe a à dire à ce sujet:

En utilisant des signes numériques

interpolation de chaîne:

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

interpolation de chaîne échappée automatique dans 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 --->

Le passage des arguments / attributs complexes 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 --->

Le passage des arguments complexes, il faut que dans SIGNES # CFML, non CFScript. En outre, vous pouvez passer toute sorte de valeur. Les valeurs simples, des tableaux, struct, cfcomponents, cffunctions, objets java, objets com, etc

Dans tous ces cas, le texte entre les signes ne <=> pas doivent être nom d'une variable . En fait, il peut par toute expression. Bien sûr, pour l'interpolation de chaîne, l'expression doit évaluer à une valeur simple, mais pour l'argument / attribut passant CFML, l'expression peut évaluer à une valeur complexe aussi bien.

La syntaxe permet #...# d'intégrer une expression dans une chaîne littérale. ColdFusion est malheureusement assez incohérents à propos de ce qui est une chaîne et ce qui est une expression. Jayson a fourni une bonne liste des exemples de quand utiliser ( ou ne pas utiliser) # s.

Au risque de paraître comme un sage-homme, une règle est la suivante: l'utilisation # autour des variables ou des expressions que lorsque pas cela ne crée pas le rendement résultat correct . Ou:. Si vous ne les avez pas besoin, ne les utilisez pas

J'aime la réponse de Jayson cependant.

Commençons par vous en supposant ne parlez pas de balises cfoutput, provoque alors la réponse est toujours, ailleurs dans votre code, si vous êtes à l'intérieur des guillemets, alors besoin d'utiliser des symboles # s'il est possible de saisir réellement la valeur qui va être utilisé ... donc si vous êtes dans une balise cfloop définissant la « à » attribut, vous pouvez facilement taper 6, mais si vous voulez utiliser une variable que vous devez utiliser les symboles #. Maintenant, si vous êtes dans une balise cfloop définissant le paramètre de requête, il n'y a aucun moyen que vous pouvez réellement saisir la requête dans cet attribut, il n'y a aucun moyen de taper une requête, donc pas de symboles # sont nécessaires.

De même dans une balise cfdump, vous pouvez jeter un texte statique, donc si vous voulez vider le contenu d'une variable, alors vous aurez besoin d'utiliser un symbole #. Ce problème est généralement auto-correction, mais je sens votre douleur, vos élèves sont probablement frustrés qu'il n'y a pas « TOUJOURS UTILISER LES » ou « NE JAMAIS UTILISER LES » approche ... Malheureusement, ce n'est pas le cas, la seule chose qui est vrai, est qu'une seule façon de l'intérieur entre guillemets va être correct. Donc, si elle ne fonctionne pas à regarder dur et long et penser à vous-même: « Puis-je saisir cette valeur au lieu d'utiliser à la valeur contenue dans cette variable? » Si la réponse est non, alors les symboles # ne seront pas nécessaires, sinon obtenir votre personnage # foo sur.

scroll top