web-dev-qa-db-ja.com

ColdFusion:変数の型を取得

ColdFusionの_<cfdump />_タグで提供される情報は、PHP function var_dump()よりもはるかに少なくなります。

私の変数がどのタイプ(整数、文字列など)であるかを見つけるためにCFで他の可能性はありますか?

25
Toby

CFMLは動的に型付けされるため、必要に応じて型を変更できます。

<cfdump var=#getMetadata(var)# />を実行するか、getMetadata(var).getName()にアクセスするだけで、変数の現在の(JVM)タイプを確認できます。

一般的に、何かが特定のタイプであるかどうかは気にせず、それがで特定のタイプに自動的にキャストされるかどうかは同じです-このため、 isSimpleValueisNumericisDate 、および その他さまざま を含む関数です。

したがって、isNumeric(string)を呼び出すとtrueが返される場合、その変数を数学的な目的で使用できることがわかります。

ほとんどの場合、これは平均的なCF開発者が気にするすべてのことであり、この回答の残りの部分はおそらく重要ではありません(もちろん、それでも興味深いかもしれません)。

ColdFusionとタイプ

タイプを直接処理する理由がある場合は、Adobe ColdFusionがタイプを使って面白いことを行うことに注意する必要があります。<cfset number = 123 />を実行すると、string数値型ではありません。

実際、ACFのほとんどの単純な値は文字列として作成されます(必要に応じて、関連する型に自動的にキャストされます)。

同時に、すべての単純な値が文字列として保存されるわけではありません。<cfset number = 1 + 1 />を実行すると、代わりに数値が返されます。

このコードで使用されているタイプを確認できます。

<cfset TypeTest =
    { array   = []
    , struct  = {}
    , string  = "123"
    , number  = 123
    , boolean = true
    , date    = Now()
    , number2 = 1+1
    }/>

<cfloop item="key" collection=#TypeTest# >
    <cfoutput><br/> #key# = #getMetadata(typetest[key]).getName()#</cfoutput>
</cfloop>


CF10でのこのコードの結果は次のようになります。

ARRAY = coldfusion.runtime.Array
STRUCT = coldfusion.runtime.Struct
STRING = Java.lang.String
NUMBER = Java.lang.String
BOOLEAN = Java.lang.String
DATE = coldfusion.runtime.OleDateTime
NUMBER2 = Java.lang.Double

この長々とした説明の理由は、ダンプしたときにCFがタイプを表示する場合、半分の時間で「文字列」と表示され、必ずしもそれほど有用ではないためです。

Workaround

[潜在的な]タイプを知る必要がある場合は、上記の変換チェック関数を使用して独自のダンプタグ/関数を作成し、何を見ているかを判断して関連情報を出力する必要があります。

Railoとタイプ

Buchesによるコメント で述べたように、 Railo (代替CFMLエンジン)は、ダンプ時にタイプを表示し、正しいタイプを表示します。

これはRailoが(ほとんど)すべてを文字列に変換するだけではないためです-関連する型から始まり、必要に応じて変換します。

これを示すために、上記のコードスニペットを実行できます。これがRailo 3.3に対して実行した結果です。

ARRAY = railo.runtime.type.ArrayImpl
STRUCT = railo.runtime.type.StructImpl
STRING = Java.lang.String
NUMBER = Java.lang.Double
BOOLEAN = Java.lang.Boolean
DATE = railo.runtime.type.dt.DateTimeImpl
NUMBER2 = Java.lang.Double

単純な1ワード型が必要な場合は、おそらくこれで実用的な値を取得できます。

ListLast(type,'.').replaceAll('Impl$','')

(特定のJava-> CFML変換関数はありません- 関連するソースコードを見る で、cfdumpの型ラベル付けがどのように行われるかを確認できます。)

56
Peter Boughton

CFの変数には型がありません。それらを適切に使用するかどうかは開発者のベストプラクティス次第ですが、CFは変数が整数でも文字列でも同じように処理します。

構造体、配列、コンポーネント/関数については、CFDUMPを介して詳細を確認できます。

4
Rob Barthle

これは少し更新されたバージョンです。これには、追加のColdFusion構造体データ型が含まれます

<cfscript>
 TypeTest = {array   = []
    , struct  = {}
    , orderedstruct = [:]
    , sortedstructNumeric = StructNew("ordered","numeric")
    , sortedstructText = StructNew("ordered","text")
    , string  = "123"
    , number  = 123
    , boolean = true
    , date    = Now()
    , number2 = 1+1
    };


TypeTest.each(function(key, value) {
    TypeTest[key] = {"value" : value,  "meta" : getMetadata(value).getName() };
    });

writedump(TypeTest);
</cfscript>

結果

enter image description here

1
James A Mohler