3

现在这似乎是非常直接的事情,但在 ColdFusion 中似乎并非如此。我需要从自身内部创建一个 CFC 实例,var a = new this()但这显然不起作用。不能使用 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 位于一个以连字符命名的文件夹中,如 in my-folder,返回的路径看起来像my.-folder.myCFC在连字符之前插入了一个句点。显然我可以用正则表达式来操作这个字符串,但这不是我想要走的路。

希望有人有更清洁的方法,谢谢。

4

1 回答 1

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);
}
于 2012-04-04T11:03:09.027 回答