我想知道是否有人想过他们认为在coldfusion中存储和访问自定义函数的最佳方式。
我目前正在做什么:目前我有各种CF-Components,我在其中存储相关功能。例如:
<cfcomponent displayname="Math">
<cffunction name="func1">
<!---Code--->
</cffunction>
<!---Function 2, Function 3, etc.---->
</cfcomponent>
然后,当我需要在页面上使用它时,我会执行以下操作
<cfset lv_math_obj = createobject("component","cfc.Math")>
<cfset variable = lv_math_obj.myFunction(parameter)>
为什么我喜欢它:上面的代码易于阅读和理解,我的功能已经预编译了!
为什么我不喜欢它:对象不应该是一个彼此独立工作的函数列表。
有没有人想过更好的存储和访问自定义功能的方法?
答案 0 :(得分:1)
你目前所做的事情本身并没有什么不妥,但对于每个请求你都要实例化cfc.Math
,这不应该在CF9 +中扼杀,但不是必需的。
您可以通过在onApplicationStart()
中实例化一次来优化它,并将对象放入Application
范围。但是,这样做会使调用UDF相当冗长,即Application.math.func1()
。您可以在Variables.math = Application.math
中设置onRequest()
,然后您的所有CFM都可以访问math.anyFunc()
。为了使您的UDF可以被任何CFC方法访问,您可以考虑将UDF放在Form
或Url
范围内以避免需要使用范围前缀。
此外,当您更新cfc.Math
时,您需要通过执行大多数框架执行的操作来清除旧副本(例如?init=true
,在onRequestStart()
中检测到,并进行退出重新初始化),或重新启动应用程序。
IMO最简单的方法是将UDF放入math.cfm
并在我需要使用之前包含它。
答案 1 :(得分:0)
您可以将常用函数放在请求范围内。
<cffunction name="OnRequestStart" access="public" returntype="boolean" output="false">
<cfargument name="TargetPage" type="string" required="true"/>
<cfinclude template="/udfs/global.cfm">
<cfreturn true />
</cffunction>
我发现这很容易使用。也可以将一个或多个组件放在应用程序范围内,但正如亨利指出的那样,当您开发或更改网站时,这可能会非常烦人。
如果将函数放在请求范围内,则需要引用该函数。例如,包含的/udfs/global.cfm文件可以包含以下函数:
<cffunction name="func1">
<!---Code--->
</cffunction>
<cfset request.func1 = func1>
在应用程序中,您可以使用以下语句调用此函数:
<cfset test = request.func1()>