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 は、ハイフンで名前が付けられたフォルダー内に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 に答える