26

ColdFusion<cfdump />タグは、PHP 関数よりもはるかに少ない情報しか提供しませんvar_dump()

CF で、変数の型 (整数、文字列など) を見つける他の可能性はありますか?

4

3 に答える 3

55

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

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

一般に、何かが特定のタイプであるかどうかは関係ありません。特定のタイプに自動的にキャストできるかどうかは関係ありません。このため、isSimpleValueisNumericisDateなどの関数があります。

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

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

ColdFusionとタイプ

型を直接処理する理由がある場合は、AdobeColdFusionが型に対して面白いことを行うことに注意する必要があります。<cfset number = 123 />結果を数値型ではなく文字列に変換します。

実際、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がダンプ時にタイプを表示する場合、半分の時間は「文字列」と表示され、必ずしも非常に役立つとは限らないためです。

回避策

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

Railoとタイプ

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

これは、Railoが(ほとんど)すべてを文字列に変換するだけでなく、関連するタイプで始まり、必要に応じて変換するためです。

これを示すために、上記のコードスニペットを実行できます。これは、Railo3.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の型ラベル付けがどのように行われるかを確認できます。)

于 2012-06-26T14:21:57.653 に答える
6

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

構造体、配列、またはコンポーネント/関数の詳細については、CFDUMP を使用して入手できます。

于 2012-06-26T13:27:00.640 に答える