Когда следует использовать # в ColdFusion?
Это было одним из самых больших препятствий в обучении новых людей ColdFusion.
Когда использовать #, в лучшем случае является двусмысленным. Поскольку использование их нередко создает проблему, кажется, что большинство людей тяготеет к их чрезмерному использованию.
Итак, каковы основные правила?
Ответы
Ответ 1
Я думаю, что может быть проще сказать, где НЕ использовать #. Единственное место в операторах cfif и операторов cfset, где вы не используете переменную для построения строки в кавычках. Вам нужно будет использовать знак # почти во всех других случаях.
Пример того, где вы не собираетесь его использовать:
<cfset value1 = 5>
<cfset value2 = value1/>
<cfif value1 EQ value2>
Yay!!!
</cfif>
<cfset value2 = "Four plus one is " & value1/>
Примеры того, где вы будете использовать #:
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:
Одна мелочь, которую я только заметил, кажется непоследовательной, условные циклы позволяют использовать имя переменной с знаками # и без них.
<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>
Ответ 2
Здесь, что Adobe скажет об этом:
Использование знаков количества
Ответ 3
Строковая интерполяция:
<cfset name = "Danny" />
<cfset greeting = "Hello, #name#!" />
<!--- greeting is set to: "Hello, Danny!" --->
Интерполяция с автоматическим экранированием в 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 --->
Передача сложных аргументов/атрибутов в 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 --->
Для передачи сложных аргументов требуется #
signes только в CFML, а не в CFScript. Кроме того, вы можете передать любое значение: простые значения, массивы, структуры, cfcomponents, cffunctions, java objects, com objects и т.д.
Во всех этих случаях текст между знаками #
не должен быть именем переменной. Фактически, это может быть любым выражением. Конечно, для интерполяции строк выражение должно оцениваться простым значением, но для передачи аргумента/атрибута в CFML выражение может также оцениваться любым сложным значением.
Ответ 4
Синтаксис #...#
позволяет вставлять выражение в строковый литерал. ColdFusion, к сожалению, довольно не согласен с тем, что строка и какое выражение. Jayson предоставил хороший список примеров того, когда использовать (или не использовать) #s.
Ответ 5
Рискуя выглядеть как мудрый парень, эмпирическое правило: используйте # вокруг переменных или выражений только тогда, когда не делает это не дает правильного результата. Или: если они вам не нужны, не используйте их.
Мне нравится ответ Джейсон.
Ответ 6
Давайте начнем с предположения, что вы не говорите о тегах cfoutput, поэтому ответ всегда, в другом месте вашего кода, если вы находитесь внутри кавычек, тогда вам нужно использовать # символов, если возможно на самом деле ввести значение это будет использоваться... поэтому, если вы используете тег cfloop, устанавливающий атрибут 'to', вы можете легко ввести 6, но если вы хотите использовать переменную, вам нужно использовать символы #. Теперь, если вы в теге cfloop устанавливаете параметр запроса, вы не можете на самом деле вводить запрос в этот атрибут, нет способа ввести запрос, поэтому не нужно # символов.
Аналогично в теге cfdump вы можете ставить статический текст, поэтому, если вы хотите сбросить содержимое переменной, вам нужно будет использовать символ #. Эта проблема обычно самокорректируется, но я чувствую вашу боль, ваши ученики, вероятно, разочарованы тем, что нет подхода "ВСЕГДА ИСПОЛЬЗОВАТЬ ИХ" или "НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ИХ"... К сожалению, это не так, единственное, что это правда, только один путь внутри кавычек будет правильным. Поэтому, если он не работает, посмотрите на это много и долго и подумайте: "Могу ли я ввести это значение вместо использования значения, содержащегося в этой переменной?" Если ответ отрицательный, тогда символы # не нужны, в противном случае ваш символ # будет включен.