ColdFusion:获取变量类型

Tob*_*oby 24 variables coldfusion types

ColdFusion <cfdump />标签给我的信息比PHP函数少得多var_dump().

在CF中是否还有其他可能性来找出我的变量是什么类型(整数,字符串等)?

Pet*_*ton 54

CFML是动态类型的,因此类型可以根据需要进行更改.

您可以通过执行<cfdump var=#getMetadata(var)# />或仅通过访问来查看变量的当前(JVM)类型getMetadata(var).getName().

一般情况下,你不关心的东西是否是特定类型的,这么多,因为它是否可以自动转换为特定类型的-因为这个原因有功能,包括isSimpleValue,ISNUMERIC,而isDate,和各种各样其他.

因此,如果调用isNumeric(string)返回true,那么您知道可以将该变量用于数学目的.

在大多数情况下,这是CF开发人员所关心的所有问题,其余的答案可能并不重要(但当然可能仍然很有趣).

ColdFusion和类型

如果您有理由直接处理类型,则需要注意Adobe ColdFusion对类型执行有趣的操作 - <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>
Run Code Online (Sandbox Code Playgroud)


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
Run Code Online (Sandbox Code Playgroud)

这个冗长解释的原因是,如果CF在你倾销时显示类型,那么它会说"字符串"的一半时间并不一定非常有用.

解决方法

如果您需要知道[潜在]类型,那么您需要创建自己的转储标记/函数,该函数利用上述转换检查功能来确定您正在查看的内容并输出相关信息.

铁路和类型

正如Busches评论中所提到的,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
Run Code Online (Sandbox Code Playgroud)

如果你想要一个简单的单字类型,你可能会得到一个明智的价值:

ListLast(type,'.').replaceAll('Impl$','')
Run Code Online (Sandbox Code Playgroud)

(没有特定的Java-> CFML转换函数 - 您可以通过查看相关的源代码来了解如何为cfdump完成类型标记.)

  • 我仍然讨厌CFML,但生活变得更加轻松,多亏了你. (2认同)

Rob*_*hle 5

CF中的变量是无类型的.由开发人员最佳实践来正确使用它们,但CF对变量的处理是相同的,无论它们是整数还是字符串.

对于结构或数组或组件/功能,可通过CFDUMP获得更多详细信息.

  • Railo 版本的 cfdump 实际上会向您显示转储时变量的类型。 (2认同)