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 和类型

如果您有理由直接处理类型,则需要注意 Adob​​e 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 在您转储时显示类型,则一半时间它会说“字符串”,不一定很有用。

解决方法

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

Railo 和类型

正如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 的类型标记是如何完成的。)

于 2012-06-26T14:21:57.653 回答
6

CF 中的变量是无类型的。正确使用它们取决于开发人员的最佳实践,但无论变量是整数还是字符串,CF 都会以相同的方式对待它们。

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

于 2012-06-26T13:27:00.640 回答
2

这是一个稍微更新的版本。这包括额外的 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>

结果

在此处输入图像描述

于 2019-10-20T05:24:47.010 回答