ColdFusion中的自动类型转换11

时间:2014-12-12 16:19:02

标签: coldfusion

我正在将应用程序从ColdFusion 9迁移到ColdFusion 11。

在现有代码中,将变量赋值给false

<cfset VARIABLES.roleTypeId = false >

然后,更进一步,一个期望这个变量是数字的函数:

<cffunction name="rolesForStudy" >
    <cfargument name="id" hint="Study Id">
    <cfargument name="roleTypeId" default="#VARIABLES.roleTypeId#" type="numeric"/>
</cffunction>

我继承了代码,我无法捍卫原始程序员决定以这种方式设置它 - 但是,简而言之,它在ColdFusion 9中工作,而且它在ColdFusion 11中没有工作(返回数据类型错误)。我假设ColdFusion 9自动将false转换为0

我的问题:我是否可以在ColdFusion 11中更改配置设置以使其像ColdFusion 9那样进行转换?或者我是否必须修复此代码,以及整个应用程序中可能还有许多其他类似示例?我和ColdFusion管理员都无法在ColdFusion Administrator界面,ColdFusion文档或在线中找到有关此内容的任何信息。

编辑以回应Adam Cameron的评论

我创建了一个由以下10行组成的文件(没有别的):

<cfset VARIABLES.roleTypeId = false >
<cfoutput>
<p>#rolesForStudy( 1, VARIABLES.roleTypeId )#</p>
</cfoutput>

<cffunction name="rolesForStudy" >
    <cfargument name="id" hint="Study Id">
    <cfargument name="roleTypeId" default="#VARIABLES.roleTypeId#" type="numeric"/>
    <cfreturn "It worked" >
</cffunction>

当我在ColdFusion 9中执行它时,它显示单词&#34;它工作&#34;。

当我在ColdFusion 11中执行它时,它返回以下错误消息:
如果将组件名称指定为此参数的类型,则可能无法找到或无法访问该组件的定义文件。

3 个答案:

答案 0 :(得分:7)

我相信你必须修复代码。没有任何设置(我知道无论如何)改变了CF处理布尔类型的方式。您应该能够从&#34; false&#34;更改上面的分配。为0,你的功能代码将工作。但是我怀疑在其他地方你可能会有类似<cfif variables.roletypeID IS "False">的东西,然后它会被破坏,因为它实际上正在寻找一个字符串 - 可以工作(ha)。 CF将无数值的处理视为布尔值(0或非0,真,假,是和否)是它的起源遗产。它有时很方便,但肯定会导致这样的事情。

与此同时,我想知道这种行为的改变是一个新的错误还是修复了一个旧的bug。在我看来,传递&#34;假&#34;作为一个参数并将其读作数字似乎不一致所以 new 这样做的方式似乎对我而言。但是,许多语言将0或0视为true和false的默认值。

编辑:

根据亚当在下面的评论,我的代码示例中有人会说:

<cfif somevar IS "false">

...即使somevar确实是数字也会起作用。他的例子(有用)是:

#0 is "False"#

...将输出&#34;是&#34; - 所以CF正在重写字符串&#34; false&#34;在引擎盖下为零进行比较。这使我的例子不正确。

我相信我的回答仍然正确。他遇到的问题是参数传递给他的函数 - 属于&#34; boolean&#34;抛出错误,因为函数需要一个数值。但亚当的观点和例子让我觉得这个行为可能是一个错误 - 因为看起来CF在检查类型之前没有强制转换为某个数字(根据它,在CF 9中做了 乔)。

答案 1 :(得分:3)

NumberFormat是你的救星,在Ben Nadel的一篇文章中可以归功于this comment

<cfset VARIABLES.roleTypeId = false>
#NumberFormat(VARIABLES.roleTypeId)# <!-- = 0 -->
<cfset VARIABLES.roleTypeId = true>
#NumberFormat(VARIABLES.roleTypeId)# <!-- = 1 -->

因此,您应该能够在调用函数之前将其转换为预期的数字类型,或者只是执行

<cfargument name="roleTypeId" default="#NumberFormat(VARIABLES.roleTypeId)#" type="numeric">

答案 2 :(得分:1)

我已将此作为ColdFusion 11中的错误提出:&#34; Type coercion failure when passing boolean to a numeric arg&#34;。

我建议您通过对参数进行类型检查来解决这个问题。这可能是影响最小的修复。

这也是一种罕见的情况,我会在代码中添加注释,解释为什么您已经进行了类型检查。

向Joe,Mark&amp;邓肯强调与他们所发现的相矛盾。也就是说,我不同意他们的答案是最好的方法; - )