ColdFusion<cfdump />
标签给我的信息比 PHP 函数少得多var_dump()
。
CF 中是否还有其他可能性可以找出我的变量是什么类型(整数、字符串等)?
ColdFusion<cfdump />
标签给我的信息比 PHP 函数少得多var_dump()
。
CF 中是否还有其他可能性可以找出我的变量是什么类型(整数、字符串等)?
CFML 是动态类型的,因此类型可以根据需要更改。
<cfdump var=#getMetadata(var)# />
您可以通过执行或简单地访问来查看变量的当前(JVM)类型getMetadata(var).getName()
。
通常,您不关心某事物是否是特定类型,而是它是否可以自动转换为特定类型 - 因此,存在包括isSimpleValue、isNumeric、isDate和各种其他函数在内的函数。
因此,如果调用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 在您转储时显示类型,则一半时间它会说“字符串”,不一定很有用。
如果您需要知道 [潜在] 类型,那么您需要创建自己的转储标签/函数,它利用上述转换检查功能来确定您正在查看的内容并输出相关信息。
正如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->CFML 转换函数——你可以通过查看相关的源代码来了解 cfdump 的类型标记是如何完成的。)
CF 中的变量是无类型的。正确使用它们取决于开发人员的最佳实践,但无论变量是整数还是字符串,CF 都会以相同的方式对待它们。
对于结构或数组或组件/函数,可通过 CFDUMP 获得更多详细信息。
这是一个稍微更新的版本。这包括额外的 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>
结果