2012-04-04 7 views
3

これは非常に単純ですが、ColdFusionではそうではないようです。私はvar a = new this()のように、それ自身の中からCFCのインスタンスを作成する必要がありますが、これは明らかに機能しません。これは許容可能であるが、getMetaData(this).fullnameから返されるクラスパスが正しくないCFC内から新しいインスタンスを作成

component { 
    public function subQuery (required string table) { 

     var classPath = getMetaData(this).fullname; 
     return createObject("component", classPath).init(table, this.dsn); 

    } 
} 

:それは私が次の問題の周りハックをしようとしていますので、延長されるベースがあるとしてCFC名を使用することはできません。 CFCは、my-folderのようにハイフンで名前が付けられたフォルダ内にあり、返されるパスは、ハイフンの前にピリオドが挿入されたmy.-folder.myCFCのようになります。明らかに、私はRegexでこの文字列を操作することができますが、それはちょうど私が下りたい道ではありません。

願っている人には、よりクリーンなアプローチがあります。ありがとうございます。

答えて

4

理論的にはオブジェクト名に文脈を付けずに実行できるはずです。理論的にはオブジェクト名自体が実行され、現在のディレクトリをチェックする必要があります。

ので、あなたはディレクトリ名が何であるかは問題ではありません

var classPath = ListLast(getMetaData(this).fullname,'.'); 
return createObject("component", classPath).init(table, this.dsn); 

この方法で必要な仕事を行う必要があり、以下、それが拡張する任意のオブジェクト上で動作しますその1かかわらず、ディレクトリ構造の、または完全な例については

public function cloneMe() { 
    return CreateObject('component', ListLast(getMetaData(this).fullname,'.')).init(argumentCollection=arguments); 
} 

このようにして渡された引数はすべてinitに渡されます。私。拡張CFCは、などの方法を再定義することがあり、次の私は、私はいくつかのドキュメントが、おそらくないでこれを行うための方法で構築見逃していたことを期待していた

public function cloneMe(required string table) { 
    return super.cloneMe(table=arguments.table,dsn=this.dsn); 
} 
+0

(あなたは、initの引数が供給されないエラーをしたい場合) 。これはまだ恐ろしいハックのように思えますが、私はそれ以上の選択肢はありません。助けてくれてありがとうSimon。 –

+0

私は子供オブジェクトを呼び出そうとしたときに同様の問題を抱えていました。最終的には、あなたが特定したように、正規表現やマッピングに落ち着かなくてはならない相対パスがありました。両方とも理想的/ –

関連する問題