在 ColdFusion 组件中,我声明了一个函数,如下所示:
string function render(required Array actions) output=false {
//...
}
所以函数参数只能接受一个Array。但是,我需要确保数组只包含“ActionItem”对象(有一个 ActionItem.cfc 组件)
ColdFusion 中有没有办法对数组内容进行类型提示?在这种情况下,您建议什么解决方案?
在 ColdFusion 组件中,我声明了一个函数,如下所示:
string function render(required Array actions) output=false {
//...
}
所以函数参数只能接受一个Array。但是,我需要确保数组只包含“ActionItem”对象(有一个 ActionItem.cfc 组件)
ColdFusion 中有没有办法对数组内容进行类型提示?在这种情况下,您建议什么解决方案?
为了详细说明我的评论,以下是您可以创建的可能集合的概要。
我喜欢集合类,ArrayCollection
这里的类非常可重用,并允许您将包装的数组用作对象。
component ArrayCollection()
{
public function init()
{
variables.collection = [];
return this;
}
public any function get();
public function set(required array collection);
public function add(required any item);
public function remove();
}
component ActionItemCollection extends ArrayCollection
{
public function add(required ActionItem item);
public ActionItem function get();
}
component otherComponnet{
public string function render(required ActionItemCollection actions)
{
}
}
在某些情况下,这有点矫枉过正,但它允许您预先确定数组中的项目类型!
简而言之,正如彼得在评论中所说,基本答案是“你不能”。ColdFusion 没有类型数组的概念。
有两种解决方法。首先,根据需要验证每个数组项的蛮力方法,确保它是您需要的类型。这是彼得建议的,也是我通常会做的。
如果你不能实现一个它本身ActionItemCollection.cfc
包含一个.ActionItems
ActionItemCollection.cfc
ActionItem
render()
ActionItemCollection
ActionItem
也就是说,当您可以render()
检查元素是否合法时,这可能是一项非常多的工作,如果不是,则抛出异常。这不是一个完美的解决方案,但 CF 正在创造一个不完美的情况,这很公平。
实际上,ColdFusion对数组类型验证有一些支持(不要与类型化数组混淆),但它似乎只适用于自定义组件,不适用于原始类型。但是,除了这个 blog entry之外,我还没有找到关于此功能的任何其他文档。
假设我们有一个SomeObject
组件。
我们可以写:
<cffunction name="testArrayTypeValidation">
<cfargument name="someObjects" type="SomeObject[]" required="yes">
<cfdump var="#someObjects#">
</cffunction>
然后像这样调用我们的函数:
<cfset testArrayTypeValidation([new SomeObject()])>
但是,请注意它只会验证数组中第一项的类型,这意味着以下内容也可以工作:
<cfset testArrayTypeValidation([new SomeObject(), 'some string'])>
此外,它似乎不适用于原始类型,因此您不能使用type="string[]"
例如,这有点可悲。
对于原始类型,您必须实现自己的具体包装类,该类将确保仅包含某种类型的原始类型并将该类用作参数类型。
您可以编写一个函数来检查数组。它需要 2 个参数,要检查的数组和对象类型,并返回一个布尔结果。该函数将遍历对象并确定该索引处的值是否是一个对象,如果是,则查看它的元数据以确定它是否是您想要的类型。当你第一次发现一个坏元素时,你设置一个错误的返回值,并中止循环。这不是最理想的解决方案,但它可以工作并且是通用的,您可以将其用作任何其他组件的检查。
另外,为了您自己的理智,我肯定会按照您期望的方式引用所有内容:
public model.bean.Foo[] function Read(required model.bean.Foo aBean) {...}
因此该函数需要一个 Foo 对象作为参数并返回一个 Foo 对象数组。只需确保将映射添加到初始路径点(在我的情况下为“模型”),以便 CF 知道从哪里开始寻找它。在 Application.cfc 中,您将添加如下内容:
this.mappings["/model"] = getDirectoryFromPath(expandPath(".")) & "myProjectDir/model";