我正在将应用程序从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中执行它时,它返回以下错误消息:
如果将组件名称指定为此参数的类型,则可能无法找到或无法访问该组件的定义文件。
答案 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;邓肯强调与他们所发现的相矛盾。也就是说,我不同意他们的答案是最好的方法; - )