ColdFusion <cfdump />
标记给我的信息少于PHP函数var_dump()
。
在CF中是否还有其他可能找出我的变量是什么类型(整数,字符串等)?
答案 0 :(得分:53)
CFML是动态类型的,因此类型可以根据需要进行更改。
您可以通过<cfdump var=#getMetadata(var)# />
或仅访问getMetadata(var).getName()
来查看变量的当前(JVM)类型。
通常,您不关心某些内容是否是特定类型,而是是否可以自动转换为特定类型 - 因此有一些功能包括isSimpleValue ,isNumeric,isDate和various others。
因此,如果调用isNumeric(string)
返回true,那么您知道可以将该变量用于数学目的。
在大多数情况下,这是所有普通的CF开发人员所关心的,而这个答案的其余部分可能并不重要(但当然可能仍然很有趣)。
如果您有理由直接处理类型,则需要注意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>
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在你倾销时显示类型,那么它会说“字符串”的一半时间并不一定非常有用。
如果您需要了解[潜在]类型,那么您需要创建自己的转储标签/功能,该功能利用上述转换检查功能来确定您正在查看的内容并输出相关信息。
如comment by 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
如果你想要一个简单的单字类型,你可能会得到一个明智的价值:
ListLast(type,'.').replaceAll('Impl$','')
(没有特定的Java-&gt; CFML转换函数 - 您可以看到looking at the relevant source code如何为cfdump完成类型标记。)
答案 1 :(得分:4)
CF中的变量是无类型的。由开发人员最佳实践来正确使用它们,但无论CF是整数还是字符串,CF都会将变量视为相同。
对于结构或数组或组件/功能,可通过CFDUMP获得更多详细信息。
答案 2 :(得分:0)
这里是一个稍微更新的版本。其中包括其他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>
结果