Пользовательские функции позволяют разработчикам хранить часто используемые фрагменты кода вместе в повторно используемых единицах. Например, вы можете часто проверять размер определенного файла или подсчитывать количество записей в таблице базы данных. Вы можете обнаружить, что вам нужно выяснить, является ли строка заглавной или строчной буквой, или преобразовать строку в массив из отдельных символов.
Независимо от ваших потребностей, пользовательские функции (UDF) могут помочь вам в достижении вашей цели. В этой статье я покажу вам, как создавать пользовательские функции с использованием cfscript, чтобы ваша функция была совместима как с ColdFusion 5, так и с ColdFusion MX.
Функции cfscript
cfscript существует примерно с версии 4.01 . Это в основном позволяет разработчику писать код ColdFusion в синтаксисе в стиле C. Однако у cfscript
есть свои ограничения. Например, вы не можете вызывать теги ColdFusion из cfscript
. Вы должны использовать доступные функции. cfscript
, что cfscript
предлагает некоторые преимущества в производительности по сравнению с использованием тегов в некоторых ситуациях, и это часто приводит к тому, что вы используете меньше кода, чем вам может понадобиться. Кроме того, в ColdFusion 5 вы можете создавать свои собственные функции только с помощью cfscript
. Именно в этом контексте мы будем использовать cfscript
для создания наших собственных функций, совместимых вплоть до версии 5.
Для наших первых примеров мы будем использовать пару функций, которые я разместил в блоге ColdFusion в апреле, которые позволяют нам определить, является ли символ прописным или строчным. Затем мы добавим несколько функций для расширения возможностей скрипта способами, которые могут быть полезны в будущем.
Прописная функция
Для начала давайте создадим функцию, которая сообщит нам, является ли символ заглавными. Затем мы создадим его, чтобы сообщить нам, является ли символ строчным. Вот код для функции:
<cfscript> function isUpperCase(character) { if (Asc(character) gte 65 and Asc(character) lte 90) return true; return false; } </cfscript>
Сначала мы открываем наш блок cfscript
. Далее мы создаем функцию, используя ключевое слово function. Мы даем ему имя и затем указываем в скобках параметры, которые он принимает. Вам это знакомо? Если вы когда-либо работали с JavaScript, так и должно быть. Именно так объявляется функция JavaScript (за исключением блока cfscript
). Однако следует отметить несколько моментов, связанных с пользовательскими функциями ColdFusion:
- Вы не можете перегрузить или повторно объявить функцию. Создав его, вы не сможете создать другую функцию с таким же именем.
- Нельзя указывать значения по умолчанию для параметров в ColdFusion UDF.
- Вы не можете указать дополнительные параметры для UDF. Каждый параметр, который вы используете в объявлении, должен быть передан в вызов функции.
Теперь, когда я сказал вам, что вы не можете делать с UDF, вот что вы можете сделать: вы можете указать параметры, которые не объявлены. Например, я объявил только один параметр для функции выше, но я могу передать три, четыре или более параметров. Итак, обычный вызов функции будет выглядеть так:
<cfoutput> #isUpperCase("A")# </cfoutput>
Это будет отображать значение «истина». Обратите внимание, что если бы я передал строку «Aaaa», это все равно было бы истиной, потому что функция Asc
использует первый переданный символ строки и игнорирует остальные.
Однако, если я вызову его с парой дополнительных параметров, он все равно будет работать:
<cfoutput> #isUpperCase("A", "a", "b")# </cfoutput>
Это по-прежнему будет отображать «true». Он не использует эти дополнительные параметры. Но что, если мы хотим использовать дополнительные параметры, переданные в функцию? Вы спрашиваете, как мы к ним доберемся? Это действительно довольно просто. Внутри функции у нас есть массив с именем «arguments». Итак, если мы хотим использовать второй и третий параметры, мы можем просто получить к ним доступ через этот массив.
<cfscript> function argsTest() { for (i = 1; i lte ArrayLen(arguments); i = i + 1) { WriteOutput(arguments[i] & "<br />"); } } </cfscript>
Это запишет все аргументы, которые мы передаем. Мы вызываем функцию следующим образом:
<cfset a = argsTest("I", "am", "ready", "to", "code")>
Используя приведенный выше код, мы получим каждый из этих аргументов в отдельной строке. Обратите внимание на несколько вещей о нашей функции здесь:
- Мы используем
"lte"
для нашего сравнения. Это потому, что, хотя это и другой синтаксис, это все же ColdFusion. Мы должны использовать нормальные операторы CF для сравнения и логики. - Мы используем
i = i + 1
вместоi++
. Это потому, что мы снова используем ColdFusion, который не поддерживает оператор++
. - Мы используем
WriteOutput()
для отображения переменных и другой информации на странице. Это похоже на использованиеdocument.write()
в функции JavaScript. - Как и в нашей заглавной функции, обратите внимание, что мы также можем использовать обычные функции ColdFusion, такие как
Asc(), Chr(), Len(), ArrayLen(), ArrayNew()
и т. Д. - Обратите внимание на оператор return в нашей заглавной функции. В этой функции мы возвращаем простое логическое значение, которое затем может быть присвоено любой переменной, которую мы выберем. Но мы также можем возвращать сложные значения, такие как структуры и массивы. Мы увидим это через минуту.
Функция нижнего регистра
Теперь давайте закодируем нашу строчную функцию. Значения ASCII для наших строчных символов составляют от 97 до 122, поэтому мы в основном скопируем и вставим функцию верхнего регистра и изменим эти два значения.
<cfscript> function isLowerCase(character) { if (Asc(character) lte 97 and Asc(character) gte 122) return true; return false; } </cfscript>
Это будет делать для этих функций. Теперь давайте создадим функцию, чтобы решить, является ли она прописными или строчными, и предупредим нас об этом. Мы вернем значение «upper», «lower» или «false» в зависимости от переданного символа.
<cfscript> function isUpperOrLowerCase(character) { if (Asc(character) gte 65 and Asc(character) lte 90) return "upper"; else if (Asc(character) gte 97 and Asc(character) lte 122) return "lower"; return false; } </cfscript>
Мы можем использовать функцию следующим образом:
<cfif not isUpperOrLowerCase("a")> This is not a character. <cfelseif isUpperOrLowerCase("a") eq "upper"> This is an uppercase character. <cfelse> This is a lowercase character. </cfif>
Это демонстрирует способность возвращать тип данных, отличный от логического, из UDF. Теперь давайте вернем что-то более сложное: массив. Мы создадим функцию, которая превратит строку в массив символов.
<cfscript> function toCharacterArray(str) { var CharArray = ArrayNew(1); for (i = 1; i lte Len(str); i = i + 1) { CharArray[i] = Mid(str, i, 1); } return CharArray; } </cfscript>
Это принимает строку в качестве аргумента, создает новый одномерный массив, переходит от 1 до длины строки и вытаскивает каждый символ, вставляя его в массив по текущему индексу, представленному переменной i
. Затем мы возвращаем массив символов.
<cfset a = toCharacterArray('This is my array")> <cfdump var="#a#">
Приведенный выше скрипт отображает аккуратную маленькую таблицу, которая показывает каждое значение в массиве. Это действительно легко создавать пользовательские функции в ColdFusion. Теперь, когда вы знаете, как создавать пользовательские функции в ColdFusion с помощью cfscript, вот ваше назначение:
Просмотрите текущий проект или веб-сайт, который вы ранее создали в ColdFusion, и определите части этого проекта, которые можно встроить в функции. Возможно, вы используете одну и ту же функциональность в нескольких местах, или вы можете очистить свой код и упростить его, удалив его из тела ваших шаблонов и поместив в шаблон. Затем создайте свои функции, сохраните их в одном файле (если их не так уж много) и просто включите их там, где они вам нужны. Вы также можете создать на своем сайте каталог с именем «udfs» или что-то в этом роде и поместить каждую функцию в файл с тем же именем. Затем вы просто включаете нужные вам функции.
Если вам нужны бесплатные пользовательские функции, вы можете взглянуть на CFLib — там вы найдете множество очень полезных функций.