首页 > 解决方案 > 为什么我不能使用 New 实例化 CFC 的方法

问题描述

我正在尝试使用这种简单的语法来实例化 CFC

<cfset Sale = New pathtocfcfolder.sale.GetSale(SaleID = URL.id) />

当我运行上述内容时,我收到一条错误消息

找不到 ColdFusion 组件或接口路径tocfcfolder.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>

标签: coldfusioncoldfusion-2018

解决方案


看看我认为的意图是什么,您的文件夹结构可能类似于:

\pathtocfcfolder
.. Sale.cfc
page.cfm

该错误实际上说明了问题所在:没有GetSale组件。

使用New pathtocfcfolder.sale.GetSale(....),您正在尝试实例化GetSale文件夹中的组件pathtocfcfolder\sale\。CF 不知道它sale应该是一个组件。这就是 Redtopia 的建议奏效的原因。通过使用sale(),您已经告诉 ColdFusion 要查看的文件夹是由于功能/方法pathtocfcfolder而从组件开始。然后CF立即调用。sale()GetSale(...)

这不是真正New应该做的。它旨在实例化组件(或对象),而不是这些组件的函数/方法。它可以(或至少看起来可以),但这并不意味着它应该这样做。特别是如果您要在对象内部使用其他功能。将组件实例化一次并重用它。

如果您只想在组件内部使用一次函数然后将组件丢弃,则可以使用cfinvoke来调用该函数。否则,您需要实例化该对象并根据需要调用该对象上的函数。

附带说明一下,由于您使用的是 ColdFusion 2018,因此您可以使用new component("pathtocfcfolder.Sale")(而不是new pathtocfcfolder.Sale())来实例化组件,然后使用Sale.GetSale(...)来调用您的函数。2018 语法使您的意图更加清晰。

我还将再次提醒我URL在代码中直接使用变量的注意事项。将它们发送到存储过程将处理大部分 SQL 注入问题,但我认为用户提供的变量应该做的第一件事是至少经过一些基本的清理和验证。人们可能对您的应用程序非常不友好。


推荐阅读