我同意w/tpryan。 ColdSpring使這非常簡單。但是,這是另一種選擇。您可以解析CFC文件本身,而不是解析堆棧跟蹤。
<cffunction name="foo" displayname="foo" hint="this is just a test function" access="public" returntype="string">
<cfset var test = getFunctionName(getMetaData().path, getPageContext().getCurrentLineNo()) />
<cfreturn test />
</cffunction>
<cffunction name="getFunctionName" hint="returns the function name based on the line number" access="public" returntype="string">
<cfargument name="filepath" type="string" required="true" />
<cfargument name="linenum" type="any" required="true" />
<cfset var line = "" />
<cfset var functionName = "" />
<cfset var i = 1 />
<!---- loop over CFC by line ---->
<cfloop file="#ARGUMENTS.filepath#" index="line">
<cfif findNoCase('cffunction', line, 1)>
<cfset functionName = line />
</cfif>
<cfif i EQ ARGUMENTS.linenum><cfbreak /></cfif>
<cfset i++ />
</cfloop>
<!---- parse function name ---->
<cfset functionName = REMatchNoCase("(\bname=[""|'])+[a-z]*[""|']", functionName) />
<cfset functionName = REMatchNoCase("[""']+[a-z]*[""']", functionName[1]) />
<cfset functionName = ReReplaceNoCase(functionName[1], "[""']", "", "all") />
<!---- return success ---->
<cfreturn functionName />
</cffunction>
以上是針對ColdFusion 8.書面CFLOOP增加了支持用於通過線遍歷文件線(並且不讀取整個文件到存儲器)。我做了一些比較堆棧跟蹤方法和文件解析的測試。這兩種方法在從單個CFM模板直接調用的小型CFC上執行得都很好。顯然,如果你有非常大的CFC解析方法可能會慢一點。另一方面,如果你有一個大的堆棧跟蹤(就像你使用任何流行的框架一樣),那麼文件解析可能會更快。
- =萬歲的ColdFusion = -
對coldspring的良好呼籲,但你會認爲它不會這麼複雜。 – ethyreal 2009-02-20 01:51:33