Quando devo usar # no ColdFusion?
-
21-08-2019 - |
Pergunta
Este tem sido um dos maiores obstáculos para ensinar novas pessoas ColdFusion.
Quando usar # é ambígua na melhor das hipóteses. Desde usá-los muitas vezes não criar um problema, parece que a maioria das pessoas gravitam em torno de usá-los muito.
Então, quais são as regras básicas?
Solução
Eu acho que pode ser mais fácil dizer onde não usar #. O único lugar é em declarações CFIF e declarações CFSET onde você não está usando uma variável para construir uma string entre aspas. Você precisa usar o sinal # em quase todos os outros casos.
Exemplo de onde você está não vai usá-lo:
<cfset value1 = 5>
<cfset value2 = value1/>
<cfif value1 EQ value2>
Yay!!!
</cfif>
<cfset value2 = "Four plus one is " & value1/>
Exemplos de onde você vai usar #:
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:
Um excêntrico coisinha que eu só notei que parece inconsistente é laços condicionais permitem que o nome da variável a ser usada com e sem sinal #.
<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>
Outras dicas
Aqui está o que a Adobe tem a dizer sobre isso:
string de interpolação:
<cfset name = "Danny" />
<cfset greeting = "Hello, #name#!" />
<!--- greeting is set to: "Hello, Danny!" --->
Auto-escapou interpolação de string em 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 --->
Passando argumentos complexos / atributos em 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 argumentos complexos requer signes #
única em CFML, não cfscript. Além disso, você pode passar qualquer tipo de valor:. Valores simples, matrizes, estruturas, cfcomponents, cffunctions, objetos java, com objetos, etc
Em todos estes casos, o texto entre os sinais #
não tem que ser o nome de uma variável . Na verdade, ele pode por qualquer expressão. Claro que, para interpolação de string, a expressão deve ser avaliada como um valor simples, mas para o argumento / atributo passando em CFML, a expressão pode ser avaliada como qualquer valor complexo também.
Correndo o risco de soar como um cara-sábio, a regra de ouro é: uso # around variáveis ??ou expressões somente quando não isso não produz o resultado correto . Ou:. Se você não precisa deles, não usá-los
Eu gosto de resposta de Jayson embora.
Vamos começar assumindo que você não está falando sobre tags cfoutput, causa, então a resposta é sempre, em outro lugar no seu código, se você estiver dentro de aspas, então precisa usar símbolos # se é possível realmente digitar o valor que vai ser usado ... por isso, se você estiver em uma tag CFLOOP definindo o 'para' atributo, você poderia facilmente tipo 6, mas se você quiser usar uma variável que você precisa para usar os símbolos #. Agora, se você estiver em uma definição do parâmetro de consulta tag CFLOOP, não há nenhuma maneira que você realmente pode digitar a consulta em que atributo, não há nenhuma maneira de digitar uma consulta, por isso não são necessários símbolos #.
Da mesma forma, em uma tag cfdump, você pode despejar texto estático, então se você quiser jogar o conteúdo de uma variável, então você vai precisar usar um símbolo #. Este problema é geralmente auto-correção, mas eu sinto sua dor, seus alunos são, provavelmente frustrado que não há "sempre usá-los" ou "nunca usá-los" abordagem ... infelizmente este não é o caso, a única coisa que é verdade, é apenas um caminho dentro de aspas vai ser correto. Então, se não é olhar trabalhando com ele duro e longo, e pensar para si mesmo: "Eu poderia escrever esse valor para fora em vez de usar o valor contido nessa variável?" Se a resposta é não, então não será necessário os símbolos #, caso contrário, obter o seu # caráter foo por diante.