现在这似乎是非常直接的事情,但在ColdFusion中似乎并非如此。我需要在var a = new this()
内部创建一个CFC实例,但这显然不起作用。不能使用CFC名称,因为它是一个将被扩展的基础,所以我试图通过以下方式解决问题:
component {
public function subQuery (required string table) {
var classPath = getMetaData(this).fullname;
return createObject("component", classPath).init(table, this.dsn);
}
}
这是可以接受的,但从getMetaData(this).fullname
返回的类路径不正确。 CFC位于使用my-folder
中的hypen命名的文件夹中,返回的路径看起来像my.-folder.myCFC
,并且在连字符之前插入了句点。显然我可以用正则表达式操纵这个字符串,但这不是我想要走的道路。
希望有人采取更清洁的方法,谢谢。
答案 0 :(得分:4)
理论上,您应该能够在没有任何关于对象名称的上下文的情况下执行此操作,因为它将从内部执行,并且应该检查其当前目录。
因此,以下应该完成您需要的工作
var classPath = ListLast(getMetaData(this).fullname,'.');
return createObject("component", classPath).init(table, this.dsn);
这样,目录名称无关紧要,无论目录结构如何,它都适用于任何扩展该目录的对象,或者是完整的示例
public function cloneMe() {
return CreateObject('component', ListLast(getMetaData(this).fullname,'.')).init(argumentCollection=arguments);
}
这样传入的任何参数都会传递给init。即扩展CFC可以重新定义方法如下(如果在未提供init参数时需要错误)
public function cloneMe(required string table) {
return super.cloneMe(table=arguments.table,dsn=this.dsn);
}