为什么我不能使用 New 实例化 CFC 的方法
Why can't I instantiate a CFC's method using New
我正在尝试使用这个简单的语法实例化 CFC
<cfset Sale = New pathtocfcfolder.sale.GetSale(SaleID = URL.id) />
当我 运行 以上时,我收到一条错误消息
Could not find the ColdFusion component or interface
pathtocfcfolder.sale.GetSale
但是,如果我只是在没有方法的情况下实例化组件,它会像这样工作得很好:
<cfset Sale = New pathtocfcfolder.sale() />
<cfdump var="#Sale.GetSale(SaleID = URL.id)#" />
GetSale 函数基本上是这样的:
<cffunction name="GetSale" returntype="Query" access="public">
<cfargument name="SaleID" type="numeric" required="true" />
<cfstoredproc procedure="dbo.GetSale">
<cfprocparam cfsqltype="cf_sql_integer" dbvarname="@SaleID" value="#ARGUMENTS.SaleID#"/>
<cfprocresult name="rsSale" resultset="1"/>
</cfstoredproc>
<cfreturn rsSale /> <!--- returns the query from the database --->
</cffunction>
看我的意图,你的文件夹结构可能是这样的:
\pathtocfcfolder
.. Sale.cfc
page.cfm
该错误实际上说明了问题所在:没有 GetSale
组件。
使用 New pathtocfcfolder.sale.GetSale(....)
,您正在尝试实例化文件夹 pathtocfcfolder\sale\
中的 GetSale
组件。 CF 不知道 sale
应该是一个组件。这就是 Redtopia 的建议奏效的原因。通过使用 sale()
,您已经告诉 ColdFusion 要查看的文件夹是 pathtocfcfolder
并且由于 ()
functions/methods 而从 sale
组件开始。然后CF立即调用GetSale(...)
。
这并不是 New
真正应该做的。它旨在实例化组件(或对象),而不是这些组件的 functions/methods。它 可以 (或者至少看起来可以这样做),但这并不意味着它应该这样做。特别是如果您要在对象内部使用其他功能。实例化组件一次并重用它。
如果您只想使用一次组件内部的函数,然后丢弃该组件,您可以使用 cfinvoke
调用该函数。否则,您可能希望实例化该对象并在需要时调用该对象上的函数。
附带说明一下,由于您使用的是 ColdFusion 2018,因此您可以使用 new component("pathtocfcfolder.Sale")
(而不是 new pathtocfcfolder.Sale()
)来实例化组件,然后使用 Sale.GetSale(...)
来调用您的函数. 2018 语法使您的意图更加清晰。
我还将补充一下关于直接在代码中使用 URL
变量的警告。将它们发送到存储过程将处理大部分 SQL 注入问题,但我认为用户提供的变量应该做的第一件事是至少进行一些基本的清理和验证。人们可能对您的应用程序非常不友好。
我正在尝试使用这个简单的语法实例化 CFC
<cfset Sale = New pathtocfcfolder.sale.GetSale(SaleID = URL.id) />
当我 运行 以上时,我收到一条错误消息
Could not find the ColdFusion component or interface pathtocfcfolder.sale.GetSale
但是,如果我只是在没有方法的情况下实例化组件,它会像这样工作得很好:
<cfset Sale = New pathtocfcfolder.sale() />
<cfdump var="#Sale.GetSale(SaleID = URL.id)#" />
GetSale 函数基本上是这样的:
<cffunction name="GetSale" returntype="Query" access="public">
<cfargument name="SaleID" type="numeric" required="true" />
<cfstoredproc procedure="dbo.GetSale">
<cfprocparam cfsqltype="cf_sql_integer" dbvarname="@SaleID" value="#ARGUMENTS.SaleID#"/>
<cfprocresult name="rsSale" resultset="1"/>
</cfstoredproc>
<cfreturn rsSale /> <!--- returns the query from the database --->
</cffunction>
看我的意图,你的文件夹结构可能是这样的:
\pathtocfcfolder
.. Sale.cfc
page.cfm
该错误实际上说明了问题所在:没有 GetSale
组件。
使用 New pathtocfcfolder.sale.GetSale(....)
,您正在尝试实例化文件夹 pathtocfcfolder\sale\
中的 GetSale
组件。 CF 不知道 sale
应该是一个组件。这就是 Redtopia 的建议奏效的原因。通过使用 sale()
,您已经告诉 ColdFusion 要查看的文件夹是 pathtocfcfolder
并且由于 ()
functions/methods 而从 sale
组件开始。然后CF立即调用GetSale(...)
。
这并不是 New
真正应该做的。它旨在实例化组件(或对象),而不是这些组件的 functions/methods。它 可以 (或者至少看起来可以这样做),但这并不意味着它应该这样做。特别是如果您要在对象内部使用其他功能。实例化组件一次并重用它。
如果您只想使用一次组件内部的函数,然后丢弃该组件,您可以使用 cfinvoke
调用该函数。否则,您可能希望实例化该对象并在需要时调用该对象上的函数。
附带说明一下,由于您使用的是 ColdFusion 2018,因此您可以使用 new component("pathtocfcfolder.Sale")
(而不是 new pathtocfcfolder.Sale()
)来实例化组件,然后使用 Sale.GetSale(...)
来调用您的函数. 2018 语法使您的意图更加清晰。
我还将补充一下关于直接在代码中使用 URL
变量的警告。将它们发送到存储过程将处理大部分 SQL 注入问题,但我认为用户提供的变量应该做的第一件事是至少进行一些基本的清理和验证。人们可能对您的应用程序非常不友好。