2009-07-01 2 views
14

Это было одно из самых больших препятствий в обучении новых людей ColdFusion.Когда следует использовать # в ColdFusion?

Когда использовать #, в лучшем случае неоднозначно. Поскольку их использование нередко создает проблему, кажется, что большинство людей тяготеет к их слишкомму использованию.

Итак, каковы основные правила?

+1

Для изучения правил требуется немного времени. Но на самом деле вам не нужно много использовать его, и я бы рекомендовал попытаться выяснить, когда вам действительно нужно его использовать, и не используйте его, когда вам это не нужно. См. Мой ответ ниже. – yfeldblum

ответ

13

Я думаю, что это может быть легче сказать, где не использовать #. Единственное место в операторах 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> 
+0

CFLOOP также не нужен для параметра запроса, тогда как CFDUMP. Не совсем последовательны. –

+1

CFLOOP ожидает/имя/запроса. Поэтому, если вы используете #s в атрибуте запроса CFLOOP, он должен оценивать строку, которая является именем переменной, которая ссылается на объект запроса. –

3

Синтаксис #...# позволяет вставлять выражение в строковый литерал. ColdFusion, к сожалению, довольно несовместим с тем, что такое строка и что является выражением. Jayson предоставил хороший список examples о том, когда использовать (или не использовать) #s.

+3

Тенденция к чрезмерному использованию # ... #, вероятно, связана с тем, что многим людям сложно решить, что такое выражение, и что такое строковый литерал, и что CF настолько прощает о избыточном использовании: works, а также работает, но в обоих случаях ## являются избыточными. – Tomalak

7

Вот что Adobe должен сказать об этом:

Using number signs

+2

+1, но это немного устарело. Например, он говорит, что знаки фунта могут содержать только переменные или функции или переменные. Это уже не так. Любое выражение (например, # 1 + 1 #) работает как минимум с CF7. –

+0

Nevermind. Я обновил ссылку на версию CF8 того же документа. –

5

Строка интерполяции:

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

Auto маскирование строка интерполяции в 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 ---> 

Передача оценочного Аргументы lex требуют, чтобы # подписывался только в CFML, а не в CFScript. Кроме того, вы можете передать любые значения: простые значения, массивы, структуры, cfcomponents, cffunctions, Java объекты, объекты COM, и т.д.

Во всех этих случаях, текст между знаками # делает не имеют должно быть имя переменной. Фактически, это может быть любым выражением. Конечно, для строковой интерполяции выражение должно оцениваться простым значением, но для передачи аргумента/атрибута в CFML выражение может также оцениваться как любое сложное значение.

1

Рискуя звучать как мудрый парень, эмпирическое правило: использование # вокруг переменных или выражений, только тогда, когда не выполнение так не дает правильный результат. Или: если они вам не нужны, не используйте их.

Мне нравится ответ Джейсон.

0

Давайте начнем с предположения, что вы не говорите о тегах cfoutput, поэтому ответ всегда, в другом месте вашего кода, если вы находитесь внутри кавычек, тогда вам нужно использовать # символов, если можно на самом деле ввести значение, которое будет использоваться ... поэтому, если вы используете тег cfloop, устанавливающий атрибут 'to', вы можете легко ввести 6, но если вы хотите использовать переменную, вам нужно использовать символы #. Теперь, если вы в теге cfloop устанавливаете параметр запроса, вы не можете на самом деле ввести запрос в этот атрибут, нет способа ввести запрос, поэтому не нужно никаких символов #.

Аналогично в теге cfdump вы можете ставить статический текст, поэтому, если вы хотите сбросить содержимое переменной, вам нужно будет использовать символ #. Эта проблема обычно самокорректируется, но я чувствую вашу боль, ваши ученики, вероятно, разочарованы тем, что нет подхода «ВСЕГДА ИСПОЛЬЗОВАТЬ ИХ» или «НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ИХ» ... К сожалению, это не так, единственное, что это правда, только один путь внутри кавычек будет правильным. Поэтому, если он не работает, посмотрите на это много и долго и подумайте: «Могу ли я ввести это значение вместо использования значения, содержащегося в этой переменной?» Если ответ отрицательный, тогда символы # не нужны, в противном случае ваш символ # будет включен.